获取特定节点的所有子节点直到特定深度

时间:2017-05-29 07:55:49

标签: graph neo4j

在我的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;

返回

enter image description here
当我把depth = 2时,它没有返回D' (only returned A and not B`,'C'的所有子项。

预期回复是:

所有孩子的'F',所有孩子的'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)

1 个答案:

答案 0 :(得分: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]