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

如何返回neo4j中具有特定关系的节点,然后返回与第一个节点具有不同关系的节点?,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有一堆“引用”其他节点的节点。然后,所引用的节点(称为关系)可能与另一个名为changed-to的节点具有关系。由更改的_-to关系关联的那些节点也可能与另一个节点具有另一个更改的_-to关系。我想返回引用的节点,但也要返回引用的节点更改为的节点。我尝试了一个查询,该查询返回引用的节点和一个联合,该联合的可选匹配项ReferencedNode更改为ResultNode,但我认为这不会起作用,因为它只会得到引用的节点加上第一个更改为node的节点,并且在这之后什么都不会发生,假设从一开始就可以。

我有一堆“引用”其他节点的节点。然后,所引用的节点(称为关系)可能与另一个名为changed-to的节点具有关系。由更改的_-to关系关联的那些节点也可能与另一个节点具有另一个更改的_-to关系。我想返回引用的节点,但也要返回引用的节点更改为的节点。我尝试了一个查询,该查询返回引用的节点和一个联合,该联合的可选匹配项ReferencedNode更改为ResultNode,但我认为这不会起作用,因为它只会得到引用的节点加上第一个更改为node的节点,并且在这之后什么都不会发生,假设从一开始就可以。如何使用所描述的行为进行查询

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


您能举一些您尝试过的查询的例子吗?以下是我的想法:

MATCH path=(n)-[:refer_to]->(o)-[:changed_to*1..5]->(p)
WHERE n.id = {start_id}
RETURN nodes(path), rels(path)
当然,我不知道您是否有
id
属性,因此可能需要更改。此外,您还将在此处传入一个
start\u id
参数。

如果要返回“references”节点和最后一个“changed\u 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]
这将返回开始节点、“引用”节点和

  • 没有“已更改为”节点时不执行任何操作
  • 只有一个节点时,该节点“已更改为”
  • 当存在多个节点时,最后一个“更改为”节点

您可以在下面的示例中测试查询。它包含这三种情况,您可以通过将上面的
{uid}
替换为
1
5
8
来测试它们,以获得这三条路径的起始节点。

您的网络图和您迄今为止尝试的查询会有所帮助。下面是数据库的片段。如果关系没有更改,我只想要引用的节点,但是如果有,我想要最初引用的节点,加上它成为的最后一个节点。每个节点都有一个唯一的属性值,一个节点ID号(如果愿意)。这就是你的意思吗?有内置的Neo4j(它可能会被回收,因此不适合长期使用),你可以创建自己的唯一标识符属性(这只是你设置了
约束的另一个属性)。只要你能指定一种开始路径的方式,任何一种方式都不重要。我在nodeID上设置了一个唯一的约束,可以吗?当然可以。老实说,你可以使用任何属性,如果恰好匹配多个开始节点,也可以,只要你想清楚,uid是我定义的属性还是预定义的属性?
uid
只是我为示例查询编写的一个普通属性,你可以使用任何你想要获得开始节点的东西。我称它为
uid
,因为称它为
id
会让一些人把它与您可以通过
id(n)
获得的内部id混淆。看看你的评论,你似乎有一个
nodeID
属性,所以也许我应该在示例查询中使用这个属性——这个想法就是使用一些东西来获得查询的唯一起点。