Returning only simple paths in Neo4j Cypher query

匆匆过客 提交于 2019-11-27 01:09:36

Specifying the uniqueness of paths is a planned feature of cypher.

So right now we have to ascertain that no node is a duplicate in the path.

There is an ALL predicate that must hold true for all elements of a collection (which a path is). And with filter you can extract the elements of an collection for that a certain condition holds true.

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

So what I did was:

  • For all nodes of the path n
  • Filter the path for the nodes that are equal to n
  • determine the length of that collection
  • assert with ALL that it has to be ONE for each n

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

my workaround for this:

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

see the example in console

In 2.3.0, use the following:

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!