Neo4j Cypher从特定节点找到循环

问题描述 投票:0回答:3

我想找到所有在Neo4j数据库中以特定节点发起和终止的循环。我试过了:

START n=node:Event(time=",timestamp,")
MATCH p=(n)-[:LINKED_TO*1..5]->(n)
WHERE NONE (n IN nodes(p) WHERE size(filter(x IN nodes(p) WHERE n = x))> 2)
RETURN p, length(p)

这是我可以通过网络上的最好的混搭。我不喜欢这两件事:1。崩溃2.计数阈值必须为“> 2”以允许启动+终止节点。这意味着将包含两次访问同一中间节点的循环,我希望不是这种情况。

我对最短路径不感兴趣。我想知道返回到我的起始节点的所有循环。

先感谢您!

neo4j cypher
3个回答
1
投票

此查询应返回在指定节点处开始和结束且没有其他重复节点的所有循环:

START n=node:Event(time=",timestamp,")
MATCH p=(n)-[:LINKED_TO*1..5]->(n)
UNWIND TAIL(NODES(p)) AS m
WITH p, COUNT(DISTINCT m) AS cm
WHERE LENGTH(p)-1 = cm
RETURN p, LENGTH(p);

0
投票

谢谢,cybersam!这很有帮助。输入时,它会出现一些错误,并警告我“START”已被弃用。我发现以下修改工作:

MATCH (n:Event{time:1458238060505007})
MATCH p=(n)-[:LINKED_TO*1..5]->(n)
UNWIND TAIL(NODES(p)) AS m WITH p RETURN p

唯一的问题是它似乎给出了通过所需起始节点的所有路径,n。真的吗?如果是这样,有没有办法纠正这个?


0
投票

这最终对我有用。它与cybersam建议的非常接近。抱歉这样做“错误的方式”。我确信cybersam会再次对我大喊大叫,但是通过Comment添加代码并不是很容易阅读。

MATCH p=(n:Event{time:",timestamp,"})-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL (NODES(p)) AS m
WITH p,COUNT(DISTINCT m) AS cm
WHERE LENGTH(p) = cm
RETURN p

正如我前面提到的,一个关键点是使用“START”,它被弃用并导致错误(例如,当我在R中使用RNeo4j时,我正在使用它)。新方法似乎是使用MATCH并在路径模式中指定起始节点。对我来说另一个令人困惑的事情是使用“LENGTH(p)-1”而不是“LENGTH(p)”。对于连接到另一个节点的一个节点,路径的长度为2,而不是3,并且只有2个不同的节点。对于我的应用,“LENGTH(p)= cm”起作用。

最后,如果你想要路径中的节点,不要尝试使用“WITH m,...”,因为这会因为我不理解的某些原因弄乱“COUNT(DISTINCT(m))”计算。

© www.soinside.com 2019 - 2024. All rights reserved.