我是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 回答
此Cypher查询可能适合您的用例:
如果容量减少到
0
以下,REDUCE
子句将residual
设置为负值,即使后续权重通常会使其变为正数 .