' Cypher'de 'resmi' koşullu bir güncelleme yoktur. Bu, here ve here gösterildiği gibi bir FOREACH içinde bir CASE olan bir 'vaka hilesi' IF kullanılarak taklit edilir.Neo4j Cypher - 'no-op' vaka hilesi üzerinde sessizce başarısız FOREACH '
MATCH (reaper:REAPER)-[:TO_REAP]->(doomed)
WHERE reaper <> doomed
WITH reaper, doomed
LIMIT 1
OPTIONAL MATCH (doomed)-[x]-(doomed)
DELETE x
WITH reaper, doomed
OPTIONAL MATCH (doomed)-[r]-(related)
DELETE r, doomed
WITH related, reaper
WHERE related <> reaper
FOREACH(ignore_me IN CASE WHEN
related IS NOT NULL
THEN [1] ELSE [] END | MERGE (reaper)-[:TO_REAP]->(related))
RETURN 1
bu REAPER amacı düğümleri (subgraphs) silmektir:
İşte çalışıyorum sorgu var. Bunu doğrudan doğruya bağlı düğümleri ('mahkum' düğümleri) silerek, ardından 'mahkum' düğümlerin tüm çocuklarını doğrudan MERGE kullanarak REAPER (ilgili) 'e bağlayarak yaparız. Tabi ki, eğer çocuk yok ise, FOREACH ve CASE'in devreye girdiği herhangi bir bağlantımız yoktur. Eğer çocuk (ilgili) yoksa, o zaman FOREACH'in NO-OP olmasını bekler ve devam eder. RETURN için.
Sorun, IS null ile ilgili olduğunda, sorguyu çöker ve ANYTHING döndürmez, aynı zamanda FAIL DEĞİL. Bu bir sorundur, çünkü VS'yi silmek için hiçbir şeyin bulunmadığını belirleyemeyiz. Bu sorun nedeniyle 'yaprak' (çocuksuz tek düğüm) düğümü silinmiştir.
Sorunu çözmeye çalışırken, 'if' ifadesini (FOREACH ve CASE) kaldırdım ve ilgili null olduğunda, 'Diğer düğüm null' hatası veriyor.
FOREACH döngüsünün bir şekilde bu hatayı aldığından şüpheleniyorum, her ne kadar MERGE bu koşulda hiç çalıştırılmamalı olsa da.
Muhtemel bir Neo4j/cypher hata var olduğunu düşündüren, o yüzden kimse gelip nasıl yanlış ve verimsiz benim sorgu XD
olduğunu söyle istiyorumdüzenleme: Veri evreleme bahsetmek unuttu Bu sorguyu kendiniz test etmek istiyorsanız.
Bu benim sorunu yaşamaya kurar: Eğer silme sorgusunu çalıştırdığınızda
CREATE (r:REAPER)
CREATE (r)-[:TO_REAP]->(n)-[:doesntmatter]->(m)
CREATE (r)-[:TO_REAP]->(p)
, sen 'n' düğüm için fark edersiniz, bir 1. Ama diğeri için dönecektir 2 düğüm, m ve p (yaprak düğümleri), silinecek, ancak hiçbir şey iade edilmeyecek.
Teşekkür cybersam: Bu çözüm için
bir yolu o sorguyu iptal olmayacak, böylece sadece (sağ onun
OPTIONAL MATCH
tekabül sonra) 2 çizgilerle sonWITH
maddesini yukarı taşımak için olabilir ! Sorguyu yayınladığınızdan biraz değiştirmem gerekiyordu, çünkü silinen 'r' orijinalini siliyordu: TO_REAP ilişkisi. Nerede taşıdığınıza göre, bu TO_REAP ilişkisi artık dahil edilmemiştir. Bu yüzden onu daha fazla silmeliydim ('x' yi sildiğim yerde). Ne olursa olsun, teşhisiniz doğrudur. NULL bir değer üzerinde WITH yapıyordum, sorgunun çökmesine neden oluyor. Düzenleme: Ayrıca, biraz kafa karıştırıcı, ama son WITH yan tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce ve son WHERE yan tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce. Bunu düzenlemek isteyebilir – brehon1104Ayrıca, sorgu geçersiz kalan bir null WHERE yan tümce sanmıyorum. Bu da başarısız: | eşleme (x: THIS_DOESNT_EXIST) x ile geri dönüş 1 | Yani bir boş değişken üzerinde WITH zaman sorguları iptal gibi görünüyor – brehon1104