recursion - Cypher - neo4j 查找递归结束节点

标签 recursion neo4j cypher graph-databases

我正在尝试查找给定节点类型的所有起始节点,从数据库中的任何节点开始。这些节点没有指向它们的关系。

我目前正在手动执行此操作,但需要递归类型的语句来简化和扩展。这是到目前为止我所拥有的,以及一个描述我需要的返回语句。

MATCH ((d1:Type1 {Name: "test1"}))
MATCH ((t1:Type2)-[:Rel1]->(h1:Type3))
MATCH ((d1)<-[ud1:Rel3]-(t1))
OPTIONAL MATCH ((h1)<-[:Rel1]-(t2:Type2))
OPTIONAL MATCH ((t2)<-[:Rel2]-(d2:Type1))
OPTIONAL MATCH ((d2)<-[ud2:Rel3]-(t3:Type2))
OPTIONAL MATCH ((t3)-[:Rel1]->(h2:Type3))
OPTIONAL MATCH ((h2)<-[:Rel1]-(t4:Type2))
OPTIONAL MATCH ((t4)<-[:Rel2]-(d3:Type1))
OPTIONAL MATCH ((d3)<-[ud3:Rel3]-(t5:Type2))

RETURN DISTINCT Type1.Name where there is no Rel3 relationship

这里的要求是导航递归

Type1 < -  Type2 -> Type3 <- Type2 < - Type1 < - Type2 -> Type3 <- Type2 

路径,直到没有Type2指向Type1,并返回这些Type1的名称。

最佳答案

您的查询示例非常复杂,并且包含替代类型,这使得它有点难以理解。

我认为这可以归结为非常简单的事情,你应该尝试一下:

MATCH (startingPoint:Type1 { name: "test1" })
MATCH (startingPoint)-[:relType*]->(headNode)
OPTIONAL MATCH (headNode)-[f:relType]->()
WHERE f is null;

因此,这一切都是从 startingPoint 通过任意数量的关系与 headNode 进行匹配。我们如何知道 headNode 确实位于开头?因为我们坚持使用OPTIONAL MATCH,它不能连接到更上游的任何其他东西。我们尝试匹配另一个上游匹配,然后坚持使用 WHERE 子句,它必须丢失,因此 headNode 确实是“在顶部”。

使用您自己的 relTypes 和标签自定义此内容,您应该能够遵循此模式。

更广泛地说,当您询问起始节点并且它没有某些关系时,See also this related question .

关于recursion - Cypher - neo4j 查找递归结束节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130160/

相关文章:

import - Neo4j 服务器未在 120 秒内启动

Neo4J/Cypher - 计算 2 之间的持续时间(不含周末)

c# - 在递归方法中使用 async/await 的正确方法是什么?

C++ 二项式系数太慢

javascript - 使用异步和递归的 JS 程序卡在主进程中

java - 在 GCP 计算引擎中托管 Neo4j

java - 归并排序java实现错误

java - Neo4j、REST API、java - 密码查询

neo4j - 我如何使用 Cypher 获得两个节点之间相同关系的数量

database - Neo4j CypherQuery 获取具有(空)属性的节点