Neo4j获取路径

时间:2017-10-08 03:29:06

标签: neo4j cypher hierarchy wordnet ancestor

我正在使用带有wordnet的neo4j来计算单词之间的相似性。但是我对cypher还不是很好。

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

我正在尝试的查询是 比赛 (synset:wdo#Synset {id:“wn / 100015568-n”}), (synset1:wdo#Synset {id:“wn / 113957498-n”}), path = shortestPath((synset) - [:wdo#hyponym | wdo#hypernym *] - (synset1)) 返回路径

这让我走上了道路,但我无法从中获得共享的祖先。 任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

你可能想要一些递归关系的东西,比如this StackOverflow answer

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

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

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

答案 1 :(得分:0)

您可以在路径中获取所有后续(xyz)节点三元组,并检查y是否为x的祖先, 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

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