【问题标题】:How do I return nodes in neo4j that have a certain relationship, and then return nodes that have a different relationship with the first nodes?如何在neo4j中返回具有一定关系的节点,然后返回与第一个节点具有不同关系的节点?
【发布时间】:2015-07-27 20:28:40
【问题描述】:

我有一堆“引用”到其他节点的节点。然后,被引用的节点(refer_to 是关系)可能与另一个名为 changed_to 的节点有关系。那些通过 changed_to 关系相关的节点也可能与另一个节点有另一个 changed_to 关系。我想返回所引用的节点,以及所引用的节点被更改为的节点。我尝试了一个查询,该查询返回引用的节点与一个联合与一个可选的 ReferencedNode 匹配更改为 ResultNode,但我认为这不会起作用,因为它只会让我得到引用的节点加上第一个更改为节点,之后什么都没有那,假设一开始就可以工作。如何使用所描述的行为进行查询?

编辑: 这是正在发生的关系的一个例子。我想返回被引用的节点和被引用节点最终成为的节点,并带有一些指示符显示它最终成为那个节点。

【问题讨论】:

  • 您的网络图和您目前尝试的查询会有所帮助。
  • 这是数据库中的剪辑。如果没有改变关系,我只想要被引用的节点,但如果有,我想要最初被引用的节点,加上它成为的最后一个节点。

标签: neo4j cypher graph-databases


【解决方案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 参数。

【讨论】:

  • 每个节点都有一个唯一的属性值,如果你愿意的话,还有一个 NodeID 号。是这个意思吗?
  • 嗯,有内置的 Neo4j(它可能会被回收,因此不适合长期使用)并且您可以创建自己的唯一标识符属性(这只是另一个属性你把CONSTRAINT 放在上面)。只要您可以指定某种方式来开始路径,任何一种方式都无关紧要。
  • 我在 nodeID 上设置了一个唯一约束,这会起作用吗?
  • 当然,应该可以。老实说,您可以使用任何属性,如果恰好匹配多个起始节点也可以,只要这是您想要的
【解决方案2】:

如果您想返回“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]

这将返回起始节点、“引用”节点和

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

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

【讨论】:

  • 澄清一下,uid 是我定义的属性还是预定义的属性?
  • uid 只是我为示例查询编写的一个普通属性,您可以使用任何您想要获取的起始节点。我称它为uid,因为称它为id 会使一些人将其与您可以通过ID(n) 获得的内部ID 混淆。查看您的评论,您似乎有一个 nodeID 属性,所以也许我应该在示例查询中使用它——这个想法只是使用一些东西来获得查询的唯一起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多