我正在尝试查找给定节点类型的所有起始节点,从数据库中的任何节点开始。这些节点没有指向它们的关系。
我目前正在手动执行此操作,但需要递归类型的语句来简化和扩展。这是到目前为止我所拥有的,以及一个描述我需要的返回语句。
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/