Neo4j 父子关系

4

我有一个节点,需要找到它到根节点的所有父级关系。

例如,如果我有以下节点:

A->B->C->D(根节点) A->E->F->D(根节点)

其中A是我拥有的节点,我需要找到它的所有祖先。

我尝试了cypher查询:

MATCH (n:yo {name:"foo"})-[:HELLO*1..]->(p:yo) RETURN p

但是它显示给我的列表是这样的:B,C,D,E,F。所以它们之间的连接丢失了。是否可能有像[[B->C->D],[E->F->D]]这样的列表呢?
我在一个网站上看到了这个查询,并且它可以工作。但它返回[[A,B],[A,B,C],[A,B,C,D]]。我不需要子路径。
start c = node:node_auto_index ( object_id = ‘10179’  )
MATCH path =  c <- [ : PARENT_OF* ] – p
return  distinct
length ( path )  AS PATH_LENGTH
, extract ( n in nodes ( path ) : n.object_id ) as the_path
order by length ( path )
1个回答

4
您正在寻找类似这样的内容。匹配从A节点开始并以不是:CHILD_OF其他节点的节点结束的路径。根据您的示例数据,这将返回两行节点集合:
MATCH p=(a:Node {name: 'A'})-[:CHILD_OF*]->(end:Node)
WHERE NOT (end)-[:CHILD_OF]->()
RETURN tail(nodes(p))

如果你只需要返回一行结果,也可以使用collect()方法。

MATCH p=(a:Node {name: 'A'})-[:CHILD_OF*]->(end:Node)
WHERE NOT (end)-[:CHILD_OF]->()
RETURN collect(tail(nodes(p)))

非常好用。谢谢 Dave :D - blackmamba
还有一件事:如果我也想在集合中包含节点a呢? - blackmamba
1
只需从返回语句中删除 tail() 函数,您就可以收到路径中所有节点的完整列表。 - Dave Bennett
有没有可能进一步过滤呢?比如说,如果我想让路径在到达某个标签之前结束。例如:match p=(a:Node {name: 'A'})-[:CHILD_OF*]->(end:Node) where not (end:yoyo)-[:CHILD_OF]->() return tail(nodes(p)) - blackmamba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接