Returning only simple paths in Neo4j Cypher query

前端 未结 3 1118

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

相关标签:
3条回答
  • 2020-11-29 06:02

    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

    0 讨论(0)
  • 2020-11-29 06:02

    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

    0 讨论(0)
  • 2020-11-29 06:11

    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
    
    0 讨论(0)
提交回复
热议问题