Neo4j 获取路径中的中间节点

Neo4j get middle node in path

我将 neo4j 与 wordnet 结合使用,以便能够计算单词之间的相似度。但是我对密码还不太好。

我想要的是能够以分层模式获取两个节点之间的路径,但我需要知道它们中间的祖先。因此,如果您考虑此图并假设每个块都是一个单词,并且我们已经有了 c 节点和 b 节点,并且想要获取路径并使其能够 return 祖先节点,a.

我尝试的查询是 比赛 (语法集:wdo#Synset {id:"wn/100015568-n"}), (synset1:wdo#Synset {id:"wn/113957498-n"}), path = shortestPath((synset)-[:wdo#hyponym|wdo#hypernym*]-(synset1)) return路径

这为我提供了路径,但我无法从中获取共享祖先。 如有任何帮助,我们将不胜感激。

您可以在路径中获取所有后续的 (xyz) 节点三元组并检查 y 是否是 [=11= 的祖先] 和 z:

MATCH ...
WITH nodes(path) AS np
UNWIND range(1, length(np)) AS i
WITH np[i-1] AS x, np[i] AS y, np[i+1] AS z
WHERE ((x)-[:hypernym]->(y) OR (x)<-[:hyponym]->(y))
  AND ((z)-[:hypernym]->(y) OR (z)<-[:hyponym]->(y))
RETURN y

(查询未经测试,可能需要一些调整。另外,请查看我对数据建模的评论。)

您可能想要递归地降低关系的东西,例如

在你的情况下,要获得共同祖先,你可以尝试

MATCH (child1:node) <- [:RELATIONSHIP*1..] - (ancestor:node) - [:RELATIONSHIP*1..] -> (child2:node)
WHERE child1.id = c
AND ancestor.id = a
AND child2.id = b
RETURN a

代码未经测试,您需要为您的案例填写正确类型的节点标签和关系。