Reputation: 18601
Given a query like the following:
START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;
The result paths that I get with the query above contain cycles.
How can I return only simple paths?
Given this example:
Upvotes: 15
Views: 11244
Reputation: 1259
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
Upvotes: 2
Reputation: 41676
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:
n
n
length
of that collectionALL
that it has to be ONE for each n
see: http://console.neo4j.org/r/dpalbl
Upvotes: 16
Reputation: 5918
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
Upvotes: 3