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路径
这为我提供了路径,但我无法从中获取共享祖先。
如有任何帮助,我们将不胜感激。
您可以在路径中获取所有后续的 (x
、y
、z
) 节点三元组并检查 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
代码未经测试,您需要为您的案例填写正确类型的节点标签和关系。
我将 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路径
这为我提供了路径,但我无法从中获取共享祖先。 如有任何帮助,我们将不胜感激。
您可以在路径中获取所有后续的 (x
、y
、z
) 节点三元组并检查 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
代码未经测试,您需要为您的案例填写正确类型的节点标签和关系。