2017-05-29 2 views
1

I diese Beziehung in meinem Neo4j hat:alle Childs von einem bestimmten Knoten Get bis zu einer bestimmten Tiefe

Parent -> Childs 
F -> D,E 
D -> A,B,C 
A -> X 

Use Case: Ich versuche, alle Kinder von einem bestimmten Knoten zu erhalten, diese Abfrage mit bis zu einer bestimmten Tiefe des depth = 2

Abfrage sagen lassen Sie alle Kind-Knoten F

zu erhalten

Das gibt mir dies: (welche alle Knoten von F ohne Begrenzung des Kindes)

enter image description here

Aber wenn ich versuche, alle Childs zu bekommen bis Tiefe 2:

Abfrage Alle untergeordneten Elemente des Knotens F mit der Tiefe = 2

MATCH (p:Person)-[:REPORTS_TO *2]->(c:Person) WHERE p.name="F" 
WITH COLLECT (c) + p AS all 
UNWIND all as p MATCH (p)-[:REPORTS_TO]->(c) 
RETURN p,c; 

Welche

enter image description here
kehrt Wenn ich Tiefe = 2 gesetzt, hat es nicht alle Kinder von D' (only returned A and not B` zurückkehren, 'C')

Erwartete Antwort war:

Alle Kinder von "F", Kind aller Kinder von "F" (dh Ebene 1) und Kind aller Kinder von Knoten der Stufe 1 (dh Ebene 2)

Fehle ich etwas in meiner Abfrage oder auf eine andere Weise, um eine Antwort wie oben erwartet zu erhalten?

Hinzufügen von Daten-Set

CREATE (f:Person {name: "F"}) 
CREATE (e:Person {name: "E"}) 
CREATE (d:Person {name: "D"}) 
CREATE (c:Person {name: "C"}) 
CREATE (b:Person {name: "B"}) 
CREATE (a:Person {name: "A"}) 
CREATE (x:Person {name: "X"}) 
CREATE (a)-[:REPORTS_TO]->(x) 
CREATE (d)-[:REPORTS_TO]->(a) 
CREATE (d)-[:REPORTS_TO]->(b) 
CREATE (d)-[:REPORTS_TO]->(c) 
CREATE (f)-[:REPORTS_TO]->(d) 
CREATE (f)-[:REPORTS_TO]->(e) 

Antwort

2

Das Problem ist, Sie die Abfrage nicht für das, was Sie denken, dass Sie die Abfrage für.

[:REPORTS_TO *2] 

nicht abfragen, bis nicht in der Tiefe 2, fragt er Knoten genau Tiefe 2. Das Ergebnis wird Knoten B, C, A und F (da Sie es in hinzugefügt).

Von diesen Knoten haben nur Knoten A und F eine ausgehende Beziehung: REPORTS_TO, sodass Ihre Übereinstimmung B und C aus der Ergebnismenge eliminiert. Die zurückgegebenen Knoten sind A und F und die Knoten, die durch eine ausgehende REPORTS_TO-Beziehung (E, D und X) erreichbar sind.

Wenn Sie Ihre Abfrage zu ändern, so dass es Tiefe bis zur 2 statt genau Tiefe 2, einen Bereich auf der mit variabler Länge Beziehung verwenden (Weglassen der Untergrenze auf 1 Standard macht):

[:REPORTS_TO *..2] 

Und wenn Sie dies wünschen F im Spiel selbst aufzunehmen (anstatt es manuell hinzufügen, wenn Sie die Knoten sammeln), verwenden Sie eine untere Grenze von 0:

[:REPORTS_TO *0..2] 
+0

dank arbeitete gut für mich –

Verwandte Themen