递归查找neo4j中给定节点的所有父节点

kzmpq1sx  于 2023-06-22  发布在  其他
关注(0)|答案(2)|浏览(192)

我想写一个密码查询,给定一个节点X,它给出该给定节点的所有父节点,直到我找到具有类型属性为ROOT的根节点。
作为一个例子,我附上了下面的图像,其中我的RootNode是主要的父节点,它具有属性 {type:“ROOT”}

示例1:查找标签为 * TYPE 2:X3的节点的所有父节点 * 从图中我们可以看到,TYPE 2:X3有一个父节点TYPE 2:X1。现在TYPE 2:X1有两个父节点TYPE 1:T1和RootNode。递归地查找TYPE 1:T1的父节点,即RootNode。因此,答案将是类型1:T1和类型2:X1
示例2:查找标签为 * TYPE 2:X4的节点的所有父节点 * 从图中我们可以看到,TYPE 2:X4有4个父节点TYPE 1:T1,TYPE 2:X1,TYPE 2:X2,TYPE 1:T2这些节点都有父节点作为RootNode,因此答案将是这4个节点。

请注意,我的图可以有多达10级的父节点这样。

tjjdgumg

tjjdgumg1#

[更新]
此查询将通过遵循从给定n节点开始的所有出站关系返回所有不同的ancestor节点,不包括任何没有出站关系的节点。

... // (prior Cypher providing n)

MATCH p = (n)-[*..8]->(root)
WHERE NOT EXISTS((root)-->())
UNWIND NODES(p)[1..-1] AS ancestor
RETURN DISTINCT ancestor

这个查询还对可变长度模式设置了一个上限,以避免永远占用内存或耗尽内存。
x[1..-1]语法指定了x的子列表,该子列表由其第二个元素直到并包括其倒数第二个元素组成。* (文档有点误导,因为它集中在range()函数上,而指定子列表根本不依赖于使用range()函数。这两个概念本应单独讨论。)*

o8x7eapl

o8x7eapl2#

最简单的方法就是遍历路径长度可变的图:

match path = (s)-[*..9]->()-->(e)
where s:X4 and s:TYPE2 and e:ROOT
with [n in nodes(path) where n <> e | n] as parentnodes
return parentnodes

可变的路径长度可能会使查询爆炸,特别是如果您有超级节点。如果你有一个相当平衡的树结构,就像你的图表,这可能是可以的。
UPDATE:这将使您不需要知道根节点上的标签:

match path = (s)-[*..9]->()-->(e)
where s:X4 and S:TYPE2 and not (e)->()
with [n in nodes(path) where n <> e | n] as parentnodes
return parentnodes

相关问题