当reduce()上的条件无法再满足时,停止Cypher遍历

时间:2015-06-23 18:46:35

标签: neo4j cypher traversal pruning

假设我有一个具有单一节点类型和单一关系类型的neo4j数据库,以保持简单。所有关系都有成本"属性(如经典图形问题),其值为非负值。

现在假设我想找到ID为A的节点和ID为B的节点之间的所有可能路径,路径长度的上限(例如10)使得总路径成本低于或等于给定常量(例如20)。

完成此任务的Cypher代码如下(并且有效):

START a = node(A), b = node(B)
MATCH (a) -[r*0..10]-> (b)
WITH extract(x in r | x.cost) as costs, reduce(acc = 0, x in r | acc + x.cost) as totalcost
WHERE totalcost < 20
RETURN costs, totalcost

此查询的问题在于,它没有考虑到成本是非负的这一事实,因此可以修剪传递总成本限制的路径。相反,它列出了节点A和B之间长度为0到10的所有可能路径(这可能非常昂贵),计算总成本,然后过滤掉超出限制的路径。及时修剪路径将导致大量的性能改进。

我知道通过使用BranchStates并在相关时阻止扩展,这对遍历框架是可行的,但我想找到一个Cypher解决方案(主要是由于暴露here的原因。)

我目前正在使用2.2.2版,如果这很重要的话。

1 个答案:

答案 0 :(得分:0)

在提取物充足之前,一系列关系成本是否足够?

START a = node(A), b = node(B)
MATCH (a)-[r*0..10]->(b)
WHERE sum(r.cost) < 20
WITH extract(x in r | x.cost) as costs, reduce(acc = 0, x in r | acc + x.cost) as totalcost
RETURN costs, totalcost

顺便说一句,想要修剪就意味着你想要命令式的方式!

另外,请帮助Cypher一点,使用标签