在Neo4j的Cypher支架查询只返回简单路径(Returning only simple pat

2019-06-21 18:42发布

鉴于类似以下的查询:

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

以上是我与查询得到的结果路径包含循环。

我怎么能只返回简单路径?

鉴于这个例子 :

  • 如何避免像重复的节点的路径:[新,睡眠,三一,睡眠,新]

Answer 1:

指定的唯一路径是暗号的计划功能。

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

有一个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

见: http://console.neo4j.org/r/dpalbl



Answer 2:

我对这种解决方法:

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

看到的例子在控制台



Answer 3:

在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


文章来源: Returning only simple paths in Neo4j Cypher query