2016-03-31 3 views
0

Ich habe diese Testdatenbank:Cypher: Knoten nicht in derselben Abfrage gefunden

enter image description here

möchte ich mit zwei +B Knoten auf der rechten Seite, dass der Pfad entfernen. Dieser Fall kann allgemein als ein Pfad beschrieben werden, der PS Knoten enthält (+B Knoten sind auch PS Knoten, die keine eingehende :SOURCE Kante haben. Der Subpfad, den ich löschen möchte, ist der zwischen (writer) (exklusive) und und dieser Knoten das hat keine eingehende :SOURCE Kante (einschließlich)

Dafür habe ich diese Abfrage.

MATCH p1=(writer:A {type:'writer'})-[*]->(Q:PS)-[:TARGET*]->(T) 
WITH (Q), (writer) 
MATCH (Q) 
WHERE NOT()-[:SOURCE]->(Q) 
WITH (Q), (writer) 

MATCH p2=(writer)-[*]->(Q) 
WHERE ANY (x IN NODES(p2)[1..] WHERE x:PS AND NOT()-[:SOURCE]->(x)) 

WITH REDUCE(s = [], y IN NODES(p2)[1..] | CASE 
    WHEN y:PS THEN s + y 
    ELSE s END) AS todo 
FOREACH (z IN todo | DETACH DELETE z); 

Es identifiziert zuerst die den Knoten (n) und leitet sie dann weiter zu einer neuen Pfad Auswahl zu treffen, dass endet in diesem Knoten. Das alles funktioniert korrekt. Was nicht funktioniert, ist der allerletzte Teil beginnend mit WITH REDUCE. Es sagt es d oes nicht finden Q, aber Q kommt nicht einmal in diesem Teil vor.

Der Fehler ist Node <some ID> not found. Warum das? Warum findet es den Knoten nicht wieder und warum versucht es überhaupt im letzten Teil? Der letzte Teil wird abgeschnitten und die Abfrage funktioniert bis zu diesem Zeitpunkt wie beabsichtigt.

Antwort

1

[UPDATED]

Dieser Fehler Regel bedeutet, dass Sie einen Knoten löschen versuchen, die bereits gelöscht wurde, oder eine Beziehung zu löschen, die einen Endpunktknoten hat, die bereits gelöscht wurde.

Versuchen Sie, Ihre FOREACH-Klausel mit dem folgenden Ausschnitt zu ersetzen, die, bevor doppelten Knoten eliminiert, sich zu löschen, und löschen auch die Beziehungen vor dem Knoten:

UNWIND todo AS node 
WITH DISTINCT node 
MATCH (node)-[r]-() 
WITH COLLECT(DISTINCT node) AS nodes, COLLECT(DISTINCT r) AS rels 
FOREACH(r IN rels | DELETE r) 
FOREACH(n IN nodes | DELETE n); 

Auch scheint Ihre Anfrage zu sehr ineffizient. Hier ist eine einfachere Version, die den obigen Fix enthält:

MATCH p=(:A {type:'writer'})-[*]->(:PS)-[:TARGET]->() 
WHERE ANY (x IN NODES(p)[1..-1] WHERE x:PS AND NOT()-[:SOURCE]->(x)) 
WITH REDUCE(s = [], y IN NODES(p)[1..] | CASE 
    WHEN y:PS THEN s + y 
    ELSE s END) AS todo 
UNWIND todo AS node 
WITH DISTINCT node 
MATCH (node)-[r]-() 
WITH COLLECT(DISTINCT node) AS nodes, COLLECT(DISTINCT r) AS rels 
FOREACH(r IN rels | DELETE r) 
FOREACH(n IN nodes | DELETE n); 
+0

Nein, die Abfrage für diesen Vey-Knoten zeigt, dass es immer noch da ist. Ich habe den Code trotzdem versucht, aber der gleiche Fehler wie erwartet. –

+1

Ich habe hinzugefügt, was eine viel einfachere Version Ihrer Abfrage sein sollte. Es könnte besser funktionieren. Beachten Sie, dass keine Knotenbezeichner (wie 'Q') verwendet werden müssen. – cybersam

+0

Danke, aber jetzt bekomme ich "Kann NODE mit ID 17049 nicht laden". 'MATCH (N) WO ID (N) = 17049 RETURN N' obwohl gibt diesen exakten Knoten zurück, also ist es * dort. –