代码之家  ›  专栏  ›  技术社区  ›  bkramer

Neo4j-检查顺序路径是否存在

  •  0
  • bkramer  · 技术社区  · 7 年前

    这是我最近的一次尝试:

    WITH ['a', 'b', 'c', 'd'] AS search_list // can be any list of strings
    // FOREACH (i IN range(search_list) |
    //     MATCH (a:Node {prop:i})-->(b:Node {prop:i+1}))
    // RETURN true if all relationships exist, false if not
    

    MATCH 在一个 FOREACH . 我该怎么做呢?

    2 回复  |  直到 7 年前
        1
  •  2
  •   stdob--    7 年前

    您可以尝试为匹配整个路径手动构建查询,并使用函数执行它 apoc.cypher.run :

    WITH ['a', 'b', 'c', 'd'] AS search_list
    WITH search_list,
         'MATCH path = ' +  
         REDUCE(c = '', i in range(0, size(search_list) - 2) | 
                c + '(:Node {prop: $props[' + i + ']})-->'
         ) +
         '(:Node {prop: $props[' + (size(search_list) - 1)  +']}) ' +
         'RETURN count(path) as pathCount' AS cypherQuery
    CALL apoc.cypher.run(cypherQuery, {props: search_list}) YIELD value
    RETURN CASE WHEN value.pathCount > 0 
                THEN true 
                ELSE false 
           END AS pathExists
    
        2
  •  0
  •   cybersam    7 年前

    parameter 名单的长度是 4 ,此查询将首先搜索长度为4且具有所需开始和结束节点的所有路径(以缩小候选路径),然后过滤路径的内部节点:

    MATCH p=(a:Node {prop: $props[0]})-[*4]->(b:Node {prop: $props[-1]})
    WITH p, NODES(p)[1..-2] AS midNodes
    WHERE ALL(i IN RANGE(1, SIZE(midNodes)) WHERE midNodes[i-1] = $props[i])
    RETURN p;
    

    index :Node(prop)

    如果此查询不返回任何内容,则没有匹配的路径。