2016-04-04 14 views
1

' 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 istiyorum

dü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.

cevap

2

Bu bilgi faydalı olabilir. Daha fazla bilgi için, aşağıdaki 2 sanallaştırılmış parçacığı farklı şekilde ele alır. Foo düğümünün olmadığını varsayalım.

Pasaj 1. (WHERE maddesi hiçbir döner sorgu, iptal):

OPTIONAL MATCH (n:Foo) 
WITH n 
WHERE NULL = 123 
RETURN 1; 

Pasaj 2. (sorgu 1 tamamlar ve döner): davranış

OPTIONAL MATCH (n:Foo) 
WHERE NULL = 123 
RETURN 1; 

Bu fark Sorununuza neden olan şey olabilir.

Fakat Cypher bunu bir sonraki MATCH veya WHERE maddesi bir DELETE ayırmak için WITH kullanmanızı gerektirir.

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) 
WHERE related <> reaper 
DELETE r, doomed 
WITH related, reaper 
FOREACH(ignore_me IN CASE WHEN 
    related IS NOT NULL 
      THEN [1] ELSE [] END | MERGE (reaper)-[:TO_REAP]->(related)) 
RETURN 1 
+0

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 son WITH 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 – brehon1104

+0

Ayrı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