在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
错误!!!