2017-05-29 81 views
1

在我的Neo4j這種關係:獲取特定節點的所有孩子的,直到特定深度

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

使用案例:我想用這個查詢以獲得特定節點的所有子直到一個特定的深度,讓我們說depth = 2

查詢來獲取節點的所有子F

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

這將返回我:(這是F的所有孩子的節點無極限)

enter image description here

但是,當我試圖讓所有的孩子的,直到深度2

查詢得到深度= 2的節點F的所有孩子

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; 

當我把深度= 2,返回

enter image description here
,它未返回D' (only returned A and not B`, 'C')的所有兒童的

期望的迴應是:

所有的孩子'F'的所有孩子的孩子(即1級)和1級節點的所有孩子的孩子(即2級

我是否在我的查詢中丟失了某些內容或以其他方式獲得響應,如上所示?

添加數據集

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) 

回答

2

問題是你不能查詢你認爲你查詢。

[:REPORTS_TO *2] 

不查詢達深度2,它在精確深度2.查詢節點的結果的節點B,C,A和F(因爲所添加它)。

在這些節點中,只有節點A和F具有傳出:REPORTS_TO關係,因此您的匹配消除了結果集中的B和C.返回的節點是A和F,節點可通過傳出:REPORTS_TO關係(E,D和X)到達。

如果你想改變你的查詢,所以它的深度2,而不是確切深度2,請使用可變長度關係的範圍(省略下限使得它默認爲1):

[:REPORTS_TO *..2] 

如果你想這(手動,而不是添加它,當你收集節點)包括F在比賽本身,使用的下限爲0:

[:REPORTS_TO *0..2] 
+0

感謝,工作很適合我 –

相關問題