首页 文章

Neo4j:自定义路径遍历

提问于
浏览
1

我是Neo4j的新手 . 我已经使用以下设置实现了一个示例用例:

  • 非循环有向图

  • 个节点有一个名为externalID的属性

  • 节点:

  • 节点类型S(启动节点)

  • 节点类型E(结束节点)

  • 节点类型I(中间节点)

  • 关系:

  • 节点类型S只能与类型I的节点具有传出关系

  • 节点类型I可以从I和S进入关系

  • 节点类型I可以与I和E具有传出关系

  • 节点类型E只能与I Build 关系

  • 所有关系都分配了权重属性,可以是任何数字

在stackoverflow和几个教程的帮助下,我能够制定一个Cypher查询,它从任何具有一个externalID的起始节点到具有相同externalID的匹配端节点的所有路径 .

MATCH p=(a:S)-[r*]->(b:E) 
WHERE a.externalID=b.externalID
WITH p, relationships(p) as rcoll 
RETURN p

到目前为止,查询或多或少都有效...

但是,我不知道如何更改图形扫描方式的行为 . 实际上我只需要所有可能路径的子集 . 这些路径满足以下要求:

  • 路径遍历在具有给定容量C的Start Node S处启动 .

  • 如果遍历关系,则从当前容量C中减去此关系的权重属性(这意味着添加负权重)

  • 如果容量变为负数,则到此时为止的路径无效(直到前一个节点的路径仍然有效并可能继续其他关系)

  • 如果容量仍为正,则从此点开始继续另一个关系,并使用C - weight的结果作为新C

我可以以某种方式调整查询或Neo4j是否有任何其他可能使用上述策略获取所有路径?

非常感谢您的帮助 .

1 回答

  • 1

    此Cypher查询可能适合您的用例:

    MATCH p = (a:S)-[r*]->(b:E) 
    WHERE a.externalID = b.externalID
    WITH
      p,
      REDUCE(c = a.capacity, r IN RELATIONSHIPS(p) |
        CASE WHEN c < 0 THEN -1 ELSE c - r.weight END) AS residual
    WHERE residual >= 0
    RETURN p;
    

    如果容量减少到 0 以下, REDUCE 子句将 residual 设置为负值,即使后续权重通常会使其变为正数 .

相关问题