Neo4j:自定义路径遍历

Neo4j:自定义路径遍历,neo4j,Neo4j,我对Neo4j很陌生。我使用以下设置实现了一个示例用例: 无圈有向图 节点有一个名为externalID的属性 节点: 节点类型S(开始节点) 节点类型E(结束节点) 节点类型I(中间节点) 关系: 节点类型S只能与类型I的节点具有传出关系 节点类型I可以与I和S有输入关系 节点类型I可以与I和E有传出关系 节点类型E只能具有来自I的输入关系 所有关系都指定了权重属性,该属性可以是任意数字 在stackoverflow和一些教程的帮助下,我能够制定一个Cypher查询,该查询获取从任

我对Neo4j很陌生。我使用以下设置实现了一个示例用例:

  • 无圈有向图
  • 节点有一个名为externalID的属性
  • 节点:
    • 节点类型S(开始节点)
    • 节点类型E(结束节点)
    • 节点类型I(中间节点)
  • 关系:
    • 节点类型S只能与类型I的节点具有传出关系
    • 节点类型I可以与I和S有输入关系
    • 节点类型I可以与I和E有传出关系
    • 节点类型E只能具有来自I的输入关系
    • 所有关系都指定了权重属性,该属性可以是任意数字
在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的起始节点S处开始
  • 如果遍历关系,则从当前容量C中减去该关系的权重属性(这意味着添加负权重)
    • 如果容量为负值,则到该点的路径无效(到上一个节点的路径仍然有效,并可能继续与其他关系)
    • 如果容量仍然为正,从这一点开始继续使用另一个关系,并使用C-重量的结果作为新的C
我是否可以通过某种方式调整查询,或者Neo4j是否有其他可能使用上述策略获得所有路径


非常感谢您的帮助。

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

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;
匹配p=(a:S)-[r*]->(b:E)
其中a.externalID=b.externalID
具有
P
减少(c=a.容量,关系中的r(p)|
当c<0时,则-1,否则c-r.重量结束)作为残差
其中残差>=0
返回p;

REDUCE
子句会将
残差
设置为负值,如果容量曾经降低到
0
以下,即使随后的权重通常会使其变为正值。

我假设容量变为负值,但随后又变为正值的路径无效,对吗,这是正确的。您可能需要检查这些查询的。Cypher等价物的构造似乎相当棘手。您的图是由每个开始节点的断开连接的子图组成的,还是一个大的互连图?对于通过:I节点的所有路径,是否只有一个开始节点,或者可能有多个?图形是相互关联的。节点:可以从不同的开始节点访问我。感谢您对遍历框架的提示。这看起来很有希望。尽管我现在正在使用遍历框架作为解决方案,但我会将这个答案标记为正确的解决方案。我认为traversal framework解决方案在性能方面更好,因为这个Cypher查询将在最后找到所有路径和过滤器,而使用traversal framework方法,我可以在容量条件失败的转换处直接停止遍历。无论如何,谢谢你的努力。解决方案也很好。