如何在neo4j中获取特定节点的所有子节点
How to get all childs of a particular node in neo4j
我 在我的 neo4j 中有这种关系:
Parent -> Childs
F -> D,E
D -> A,B,C
用例:我正在尝试使用此查询
获取特定节点的所有child
MATCH (p:Person{name:"F"})<-[:REPORTS_TO*]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
这个 returns 我这个 :
{"parent":"F","child":{"name":["D","A","B","C","E"]}}
A, B, C
不是 F 的直接 child,因为它们是 D
的 child
要求的回复是
[
"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)}}
哪个returns
{"parent":"F","child":{"name":["E","D"]}}
然后搜索 E and D
的所有 child,然后搜索 child 的 child,依此类推..
我的问题是我可以在单个查询中或以更好的方式实现吗?
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)
您可以使用 OPTIONAL MATCH 来实现您的目标。
您的数据集如下所示:
试一试:
MATCH (p:Person)
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
查询结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[C, B, A]}} |
| {parent=A, child={name=[]}} |
| {parent=C, child={name=[]}} |
| {parent=F, child={name=[E, D]}} |
| {parent=E, child={name=[]}} |
| {parent=B, child={name=[]}} |
+-----------------------------------------------------+
如果您只需要一个特定的 parent 和您各自的 children,您可以这样做:
MATCH (p:Person)
WHERE p.name = "D"
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
WITH COLLECT (c) + p AS all
UNWIND all as p
MATCH (p)
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[C, B, A]}} |
| {parent=A, child={name=[]}} |
| {parent=C, child={name=[]}} |
| {parent=B, child={name=[]}} |
+-----------------------------------------------------+
编辑:
来自@Prakash Pandey 的评论:
how can we do something like childs, childs of childs and so on where
p.name = "Tom"
根据题中添加的数据集,可以做:
MATCH (p:Person)<-[:REPORTS_TO*]-(c:Person)
WHERE p.name = "X"
WITH COLLECT (c) + p AS all UNWIND all as p
MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[F]}} |
| {parent=A, child={name=[D]}} |
| {parent=X, child={name=[A]}} |
+-----------------------------------------------------+
我创建了您描述的图表。
下面的查询returns大部分是你需要的:
MATCH (a:Parent)<-[r:isParent*0..]-(b:Parent)
return {parent:a.name,child : {name :collect( b.name)}}
结果:
{"parent":"D","child":{"name":["D","A","B","C"]}}
{"parent":"A","child":{"name":["A"]}}
{"parent":"C","child":{"name":["C"]}}
{"parent":"F","child":{"name":["F","D","E","A","B","C"]}}
{"parent":"E","child":{"name":["E"]}}
{"parent":"B","child":{"name":["B"]}}
我 在我的 neo4j 中有这种关系:
Parent -> Childs
F -> D,E
D -> A,B,C
用例:我正在尝试使用此查询
获取特定节点的所有childMATCH (p:Person{name:"F"})<-[:REPORTS_TO*]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
这个 returns 我这个 :
{"parent":"F","child":{"name":["D","A","B","C","E"]}}
A, B, C
不是 F 的直接 child,因为它们是 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)}}
哪个returns
{"parent":"F","child":{"name":["E","D"]}}
然后搜索 E and D
的所有 child,然后搜索 child 的 child,依此类推..
我的问题是我可以在单个查询中或以更好的方式实现吗?
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)
您可以使用 OPTIONAL MATCH 来实现您的目标。
您的数据集如下所示:
试一试:
MATCH (p:Person)
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
查询结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[C, B, A]}} |
| {parent=A, child={name=[]}} |
| {parent=C, child={name=[]}} |
| {parent=F, child={name=[E, D]}} |
| {parent=E, child={name=[]}} |
| {parent=B, child={name=[]}} |
+-----------------------------------------------------+
如果您只需要一个特定的 parent 和您各自的 children,您可以这样做:
MATCH (p:Person)
WHERE p.name = "D"
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
WITH COLLECT (c) + p AS all
UNWIND all as p
MATCH (p)
OPTIONAL MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[C, B, A]}} |
| {parent=A, child={name=[]}} |
| {parent=C, child={name=[]}} |
| {parent=B, child={name=[]}} |
+-----------------------------------------------------+
编辑:
来自@Prakash Pandey 的评论:
how can we do something like childs, childs of childs and so on where p.name = "Tom"
根据题中添加的数据集,可以做:
MATCH (p:Person)<-[:REPORTS_TO*]-(c:Person)
WHERE p.name = "X"
WITH COLLECT (c) + p AS all UNWIND all as p
MATCH (p)<-[:REPORTS_TO]-(c)
RETURN {parent : p.name, child : {name :collect( c.name)}}
结果:
+-----------------------------------------------------+
| {parent : p.name, child : {name :collect( c.name)}} |
+-----------------------------------------------------+
| {parent=D, child={name=[F]}} |
| {parent=A, child={name=[D]}} |
| {parent=X, child={name=[A]}} |
+-----------------------------------------------------+
我创建了您描述的图表。
下面的查询returns大部分是你需要的:
MATCH (a:Parent)<-[r:isParent*0..]-(b:Parent)
return {parent:a.name,child : {name :collect( b.name)}}
结果:
{"parent":"D","child":{"name":["D","A","B","C"]}}
{"parent":"A","child":{"name":["A"]}}
{"parent":"C","child":{"name":["C"]}}
{"parent":"F","child":{"name":["F","D","E","A","B","C"]}}
{"parent":"E","child":{"name":["E"]}}
{"parent":"B","child":{"name":["B"]}}