在Neo4j Cypher查询中仅返回简单路径

在Neo4j Cypher查询中仅返回简单路径,neo4j,traversal,cypher,Neo4j,Traversal,Cypher,给出如下查询: START n = node(123) MATCH p = n-[r:LIKES*..3]->x RETURN p; MATCH path = (start {id:2})<-[*1..]-(end {id:3}) WHERE ALL(n in nodes(path) where 1 = size(filter(m in nodes(path) where m=n))) RETURN start, LENGTH(path) AS lengt

给出如下查询:

START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;
MATCH path = (start {id:2})<-[*1..]-(end {id:3}) 
WHERE ALL(n in nodes(path) where 
          1 = size(filter(m in nodes(path) where m=n))) 
RETURN start, LENGTH(path) AS length, EXTRACT(p in NODES(path) | p.id), end
ORDER BY length
通过上面的查询得到的结果路径包含循环

如何仅返回简单路径

鉴于此:

  • 我如何避免重复节点的路径,如:[Neo,Morpheus,Trinity,Morpheus,Neo]

我的解决方法:

START n = node(123), x=node(*)
MATCH p = shortestPath(n-[r:LIKES*..3]->x)
RETURN p;

请参见示例,指定路径的唯一性是cypher的计划功能

所以现在我们必须确定路径中没有重复的节点

有一个
ALL
谓词对于集合的所有元素(路径为)都必须为true。 使用
filter
可以提取某个条件为真的集合的元素

START neo=node(1) 
MATCH path= neo-[r:KNOWS*..4]->other 
WHERE ALL(n in nodes(path) where 
          1=length(filter(m in nodes(path) : m=n))) 
RETURN neo, LENGTH(path) AS length, EXTRACT(p in NODES(path) : p.name), other 
ORDER BY length
所以我所做的是:

  • 对于路径的所有节点
    n
  • 筛选等于
    n
  • 确定该集合的
    长度
  • ALL
    断言每个
    n

请参见:在2.3.0中,使用以下命令:

START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;
MATCH path = (start {id:2})<-[*1..]-(end {id:3}) 
WHERE ALL(n in nodes(path) where 
          1 = size(filter(m in nodes(path) where m=n))) 
RETURN start, LENGTH(path) AS length, EXTRACT(p in NODES(path) | p.id), end
ORDER BY length

MATCH path=(start{id:2})注意,路径长度3是一个查询参数thet can change您有使用console.neo4j.org/usage.html的示例吗?@PeterNeubauer刚刚添加了一个!这在给定的示例中可能会起作用,但实际上我对给定长度内所有可能的路径(不仅仅是最短的一条/秒)都感兴趣,并且沿途没有重复的节点。谢谢Michael,还有其他更好的方法来识别路径中的循环吗。您在上面共享的解决方案运行良好,但在时间和数据库点击率方面成本高昂。你能检查一下吗?在使用Neo4j 2.2.5时,我不得不将过滤器部分更改为
filter(m在节点(路径)中,其中m=n))
Hi。有人知道在3.0版本中有任何更新吗?对于图:
create(n:ent{id:'a'})-[:rel]>(:ent{id:'b'})-[:rel]>(o:ent{id:'c'})-[:rel]>(p:ent{id:'d'})-[:rel]>(:ent{id:'e'})-[:rel]>(n),(p)-[:rel rel]>(o)
,查询代码>匹配路径=(ent{id:'d''d'>rel id:'d'>)-[:rel a'>(p)-[:rel 1)中的所有节点的长度都是n(m在节点(路径)中,其中m=n)))返回路径
给出
未找到键:未命名25
错误!!!