Neo4j:自定义路径遍历

时间:2016-12-16 18:42:09

标签: neo4j

我对Neo4j很新。我已经使用以下设置实现了一个示例用例:

  • 非循环有向图
  • 节点具有名为externalID
  • 的属性
  • 节点:
    • 节点类型S(启动节点)
    • 节点类型E(结束节点)
    • 节点类型I(中间节点)
  • 关系:
    • 节点类型S只能与类型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 - weight的结果作为新的C

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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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;

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