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

时间:2012-12-07 17:09:46

标签: neo4j traversal cypher

给出如下查询:

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

上面的查询得到的结果路径包含循环。

我怎样才能返回简单的路径?

鉴于此example

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

3 个答案:

答案 0 :(得分:16)

指定路径的唯一性是密码的计划特征。

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

对于集合的所有元素(路径都是),必须有一个ALL谓词。 使用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
  • 的节点的路径
  • 确定该集合的length
  • 断言ALL每个n
  • 必须为1

请参阅:http://console.neo4j.org/r/dpalbl

答案 1 :(得分:3)

我的解决方法:

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

参见示例in console

答案 2 :(得分:2)

在2.3.0中,使用以下内容:

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