来自特定节点的Neo4j Cypher find循环
我想在Neo4j数据库中查找以特定节点发起和终止的所有循环。我试过:来自特定节点的Neo4j Cypher find循环,neo4j,cypher,Neo4j,Cypher,我想在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) 这是我能从web上的内容进行的最好的mashup。有两件事我不喜欢: 1.它
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)
这是我能从web上的内容进行的最好的mashup。有两件事我不喜欢:
1.它崩溃了
2.计数阈值必须为“>2”,以允许启动+终止节点。这意味着将包括两次访问同一中间节点的循环,我希望不是这样
我对最短路径不感兴趣。我想知道返回到起始节点的所有循环
提前谢谢你 此查询应返回在指定节点开始和结束且没有其他重复节点的所有循环:
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);
谢谢你,山姆!这很有帮助。键入时,它给出了一些错误,并警告我“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的所有路径。这是真的吗?如果是这样的话,有没有办法纠正这一点?这就是我最终能做到的。这与赛博山姆的建议非常接近。为“错误的方式”道歉。我相信cybersam会再次对我大喊大叫,但通过注释添加代码并不容易阅读
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时,我正在使用它)。新的方法似乎是使用匹配并在路径模式中指定起始节点。另一件让我困惑的事情是使用“长度(p)-1”而不是“长度(p)”。对于连接到另一个节点的一个节点,路径的长度为2,而不是3,并且只有2个不同的节点。对于我的申请,“长度(p)=厘米”有效
最后,如果您想要路径中的节点,请不要尝试使用“WITH m,…”,因为这会因为我不理解的原因而打乱“COUNT(DISTINCT(m))”计算。这不是答案。它应该是对我的回答的评论,或者包含在对你的问题的编辑中,或者提出一个新问题。顺便问一下,这个新的密码查询并没有实现您所说的,所以您有新的问题吗?