在我的neo4j db中得到了以下布局:
a
/ | \
b c d
/ \ |
e f g
| / \
h i j
我想要做的是查询所有子节点,例如如果起始节点为 b ,则子项为 e,f,h 。所有节点都具有相同的标签(名称)和相同的关系类型。
我可以通过以下方式实现这一目标:
MATCH (n:node {name:'b'}), (a)-[:DEPENDS_ON*]->(n) RETURN DISTINCT a.name as name
问题是,我希望每个孩子都有一个“父母”。 e.g:
我想知道 h 在输出中,因为它有父 f , f ,因为父 b 等等。
非常感谢!
彼得
答案 0 :(得分:3)
这是一个返回所有不同父/子对的查询。
MATCH path=(n:node {name:'b'})<-[:DEPENDS_ON*]-()
WITH NODES(path) AS np
WITH REDUCE(s=[], i IN RANGE(0, LENGTH(np)-2, 1) | s + {p:np[i], c:np[i+1]}) AS cpairs
UNWIND cpairs AS pairs
WITH DISTINCT pairs AS ps
RETURN ps.p, "parent of", ps.c;
答案 1 :(得分:1)
你可能想要在路径而不是节点上进行操作,尝试这样的事情:
match (n:node {name:'b'}), p=(a)-[:DEPENDS_ON*]->(n)
WITH nodes(p) as pathNodes, length(nodes(p)) as l
RETURN pathNodes[l-1] as c1, "parent of", pathNodes[l-2] as c2;
这将采用任何路径并报告路径中倒数第二个节点是路径中最后一个节点的父节点。