【发布时间】:2017-05-17 12:52:54
【问题描述】:
我在我的 neo4j 中有这种关系:
Parent -> Childs
F -> D,E
D -> A,B,C
用例:我正在尝试使用此查询获取特定节点的所有子节点
MATCH (p:Person{name:"F"})<-[:REPORTS_TO*]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
这返回给我这个:
{"parent":"F","child":{"name":["D","A","B","C","E"]}}
A, B, C 不是 F 的直接子代,因为它们是 D 的子代
要求的回应是
[
"F" : [ Childs i.e "E", "D" ]
"E" : []
"D" : [ "A", "B", "C" ]
and so on ....
]
实现此目的的一种方法是递归触发以下查询:
MATCH (p:Person{name:"F"})<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
返回
{"parent":"F","child":{"name":["E","D"]}}
然后搜索E and D 的所有孩子,然后搜索孩子的孩子等等..
我的问题是我可以通过单个查询还是以更好的方式实现这一目标?
Edit1:添加数据集
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)
【问题讨论】:
标签: neo4j cypher graph-databases