2017-05-29 79 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

感谢,工作很适合我 –

相关问题