2016-11-19 4 views
0

Hier ist ein einfaches Diagramm:Neo4j: Wie lösche ich alle Knoten und Beziehungen jenseits eines Knotens?

(:a)-[:r]->(:b) 

Wenn (:b) löschen möchten, ich kann dies tun mit:

MATCH (a)-[r]->(b :b) 
DELETE a, r, b 

jedoch (b) kann aus der es kommen mehrere Beziehungen und Knoten haben (und diese Knoten können rekursiv auch mehr Beziehungen und Knoten haben). Etwas wie folgt aus:

(:a)-[:r]->(:b)-[:s]->(x)-[:r]->(y)- ... ->(z) 

Wie kann ich rekursiv jeden Knoten und Beziehung über (b) löschen?

+0

Beachten Sie, dass Sie, wenn Sie den Doppelpunkt in Cypher weglassen, die _variable_ und nicht die _label_ angeben. Daher löscht Ihre Abfrage nicht nur '(: a) - [: r] -> (: b)' Untergraphen, sondern alle '(...) - [...] - (: b)' Untergraphen, wo Der Quellknoten und die Kante können beliebige Beschriftungen haben. Stattdessen würden Sie wollen, MATCH (a: a) - [r: r] -> (b: b) LÖSCHEN a, r, b' –

+0

Nur um zu klären, gibt es einen bestimmten Knoten 'b', die Sie löschen möchten (oder seinen verbundenen Untergraphen), oder möchten Sie dies für alle Knoten mit dem Label ': b' tun?Wenn Sie nur einen bestimmten 'b'-Knoten und seinen Untergraphen löschen wollen, was unterscheidet diesen Knoten von anderen der': b'-Bezeichnung? Ist es ein 'Name' Eigentum? Irgendeine andere Eigenschaft? – InverseFalcon

+0

@InverseFalcon Ja, es gibt einen bestimmten ': b'-Knoten, und er hat eine Eigenschaft mit einem eindeutigen Indexwert. Entschuldigung für die Verwirrung; Ich habe versucht, den Beispielcode so einfach wie möglich zu machen (aber offensichtlich war es etwas zu einfach!) – inersha

Antwort

1

DETACH DELETE wird hier nützlich sein. Dies löscht zuerst alle Beziehungen von einem Knoten und löscht dann den Knoten selbst. Das erleichtert Ihre Abfrage, da Sie nur eine Abfrage für alle Knoten benötigen, die von Ihrem b-Knoten aus erreichbar sind.

Ich gehe für diesen Moment davon aus, dass dieser b Knoten in Ihrer Frage ein bestimmter Knoten ist, anstatt jeden einzelnen Knoten mit der Bezeichnung :b. Ich möchte Sie ermutigen, die Entwicklerdokumentation zu Variablen und Labels erneut zu lesen, da ich vermute, dass hier ein wenig Verwirrung herrscht.

Wenn man also einen bestimmten b-Knoten annimmt und davon ausgeht, dass es eine Namenseigenschaft hat, die es unterscheidet, könnte man diese Abfrage verwenden, um sie und den gesamten damit verbundenen und damit erreichbaren Untergraphen zu löschen.

MATCH (b:b)-[*0..]-(x) 
WHERE b.name = 'b' 
WITH DISTINCT x 
DETACH DELETE x 

Beachten Sie, dass, weil wir über den Beziehungstyp sie sich nicht, und weil wir 0 oder mehr Beziehungen festgelegt haben, wird x auf b und seiner gesamten verbunden Subgraphen übereinstimmen, egal wie viele Beziehungen weg. Durch das Entfernen und Löschen von x werden alle Beziehungen im Untergraphen und dann alle Knoten im Untergraphen gelöscht.

1

Um rekursiv von einem Knoten zu löschen, können Sie path variables: p=(source)-[type*minimumHops..maximumHops]->(target) (standardmäßig minimumHops ist 1).

Beispiel-Datensatz:

CREATE 
    (a:a)-[:r]->(b:b), 
    (b)-[:r]->(c:c), 
    (c)-[:r]->(d:d), 
    (b)-[:r]->(e:e) 

Abfrage:

MATCH (a:a)-[r:r]->(b:b) 
OPTIONAL MATCH p=(b)-[:r*]->(c) 
DELETE a, r, b, p 

Eine alternative, äquivalente Abfrage:

MATCH 
    (a:a)-[r:r]->(b:b), 
    p=(b)-[:r*0..]->(c) 
DELETE a, r, p 

Es ist erwähnenswert, dass sowohl in der cornercase arbeiten, wo man nur haben eine einzelne (:a)-[:r]->(:b) Kante in Ihrem Diagramm. Die erste Abfrage führt dies durch Angabe des Pfades in einer OPTIONAL MATCH durch, während die zweite Abfrage die Pfade von Null-Hops erlaubt.

Verwandte Themen