2016-03-30 4 views
0

Ich möchte einen Pfad (in diesem Fall die gesamte Datenbank) finden, wo es einen :B Knoten gibt, der keine eingehende :s-Kante hat und dann alle :B s des Pfades entfernen.Cypher: Knoten aus Pfad entfernen

Dies ist mein Test-Datenbank:

MERGE (B1:B {name:"B1"})-[:t]->(B2:B {name:"B2"})-[:t]->(B3:B {name:"B3"})-[:t]->(B4:B {name:"B4"})-[:t]->(B5:B {name:"B5"})-[:t]->(C1:D {name:"D1"}) 
MERGE (A1:A {name:"A1"})-[:s]->(B1) 
MERGE (A2:A {name:"A2"})-[:s]->(B2) 
MERGE (A3:A {name:"A3"})-[:s]->(B4) 
MERGE (A5:A {name:"A5"})-[:s]->(B5) 

5)

enter image description here

Die Abfrage ich das letzte Mal versucht, das ist, aber es wirft einen Fehler:

MATCH p=(n:A)-[*] ->(o:B)-[:t*]->(m:D) 
WITH NODES(p)[1..-1] AS Pspace_nodes, o, p 
MATCH o WHERE NOT()-[:s]->(o) 
FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r) 

Fehler Nachricht:

py2neo.cypher.error.statement.InvalidSyntax: Invalid use of MATCH inside FOREACH (line 4, column 29 (offset: 143)) 
"FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r) 

Wie kann ich dies in einer gültigen Weise ausdrücken?

+0

Ihre Fehlermeldung und Ihre Abfrage zeigen eine andere 'FOREACH'-Klauseln. – cybersam

+0

danke, repariere es. –

Antwort

1

[EDITED]

Dies könnte für Sie arbeiten:

MATCH p=(:A)-[r*]-(:D) 
WHERE ANY (x IN NODES(p)[1..-1] WHERE x:B AND NOT()-[:s]->(x)) 
WITH REDUCE(s =[], y IN NODES(p)[1..-1]| CASE WHEN y:B THEN s + y ELSE s END) AS todo 
UNWIND todo AS node 
WITH DISTINCT node 
DETACH DELETE node; 

In einem größeren DB, kann dies eine lange Zeit in Anspruch nehmen zu laufen, weil die MATCH einen Pfad mit variabler Länge angibt. Wenn dies ein Problem ist, sollten Sie eine angemessene obere Grenze verwenden (z. B. [r*..5]). Die WHERE-Klausel filtert für Pfade mit einem B-Knoten ohne eingehende :s-Beziehung. Die REDUCE Funktion sammelt alle B Knoten in dem Pfad. Die UNWIND setzt jeden B Knoten in eine separate Zeile. Die DISTINCT entfernt alle doppelten Knoten, so dass der Löschversuch nicht versucht, einen Knoten zweimal zu löschen (was dazu führt, dass neo4j einen Fehler generiert). Die DETACH DELETE-Klausel löscht nicht nur diese B-Knoten, sondern auch alle ihre Beziehungen (da es Ihnen nicht erlaubt ist, einen Knoten zu löschen, ohne dies auch zu tun).

+0

Ich bekomme "(keine Änderungen, keine Zeilen)". –

+0

Bitte versuchen Sie es erneut mit meiner leicht aktualisierten Antwort. – cybersam

+0

Das funktioniert. In anderen Fällen benötigt das Schlüsselwort 'CASE' jedoch die betreffende Variable oder Eigenschaft, bevor die Fälle aufgelistet werden. warum nicht hier? –