【问题标题】:Neo4j - Check if sequential path existsNeo4j - 检查顺序路径是否存在
【发布时间】:2019-02-05 20:43:11
【问题描述】:

在给定要搜索的顺序属性列表的情况下,我想查看图的路径是否存在。该列表可以是可变长度的。

这是我最近的尝试:

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

此解决方案不起作用,因为您不能在 FOREACH 中使用 MATCH。我应该怎么做?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以尝试手动构建查询以匹配整个路径并使用函数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】:

      假设您在 $props 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;
      

      为了提高效率,您还应该在:Node(prop) 上创建一个index

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-30
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多