如何返回neo4j中具有特定关系的节点,然后返回与第一个节点具有不同关系的节点?

时间:2015-07-27 20:28:40

标签: neo4j cypher graph-databases

我有一堆节点“引用”其他节点。然后,所引用的节点(refer_to是该关系)可以与称为changed_to的另一节点具有关系。由changed_to关系相关的那些节点也可以与另一个节点具有另一个changed_to关系。我想返回引用的节点,但也返回引用节点被更改为的节点。我尝试了一个返回引用的节点,结合了一个union,并将一个ReferencedNode的可选匹配更改为ResultNode,但我认为这不会起作用,因为它只会让我引用节点加上第一个更改为节点而没有假设这一切都可以开始。如何使用所描述的行为进行查询?

编辑: 这是正在发生的关系的一个例子。我想返回引用的节点和引用节点最终成为的节点,其中一些指示器显示它最终成为该节点。

enter image description here

2 个答案:

答案 0 :(得分:1)

您能举一些您尝试过的查询示例吗?这就是我的想法:

MATCH path=(n)-[:refer_to]->(o)-[:changed_to*1..5]->(p)
WHERE n.id = {start_id}
RETURN nodes(path), rels(path)

当然,我不知道您是否有id属性,因此可能需要更改。此外,您将在此处传递start_id参数。

答案 1 :(得分:0)

如果要返回“references”节点和最后一个“changed_to”节点(如果有),则可以先匹配您知道的关系,然后可选择在可变深度处匹配可能存在的路径。如果存在多个“changed_to”关系,则此时将有多个结果项。如果您想要所有“changed_to”节点,您现在可以返回,但是如果您只想要最后一个节点,您可以按路径深度降序限制1来排序结果项以获取最长路径,然后返回最后一个节点路径。该查询可能类似于

MATCH (n)-[:REFERENCES]->(o)
WHERE n.uid = {uid}
OPTIONAL MATCH path=o-[:CHANGED_TO*1..5]->(p)
WITH n, o, path
ORDER BY length(path) DESC
LIMIT 1
RETURN n, o, nodes(path)[-1]

这将返回起始节点,“references”节点和

    没有“changed_to”节点时,
  • 什么都没有
  • 当只有一个
  • 时,一个“changed_to”节点
  • 当有多个
  • 时,最后一个“changed_to”节点

您可以在此console中测试查询。它包含这三种情况,您可以通过将{uid}替换为值158来测试它们,以获取三条路径的起始节点。