通过累积关系属性进行过滤的性能

时间:2020-03-01 20:38:23

标签: neo4j cypher

我正在尝试使所有顶点到特定节点的最大累积权重(距离)达到一定值。查询

MATCH route = (p1:ReferencePlace) - [roadlist:EROAD*..5] - (p2:ReferencePlace)
WITH p1, p2, route, roadlist, 
    REDUCE(sum=0.0, road in roadlist | sum + toFloat(road.distance)) as totaldistance
WHERE totaldistance < 300
AND p1.name = "Paris"
RETURN p1, p2, totaldistance

产生正确的输出。这使用了像here这样导入的E-road数据示例。返回距离巴黎不到300公里的所有地方。

问题是,这仅适用于有限数量的跃点EROAD*..5]。对于EROAD*],它“挂起”(我不知道它是否会在任何合理的时间内完成)。这是因为Neo4j首先找到所有可能的路由,然后过滤它们。因此,即使对于像这样的小图,路由数量也变得过大是有道理的。

从理论上讲,只要累积距离小于阈值并且仅 访问相关顶点,只要从头开始实施BFS算法即可收集所有相关顶点,这没什么大不了的。但我想知道是否有Neo4j的方法。

1 个答案:

答案 0 :(得分:0)

问题可能是图中的循环,如建议的here

我最终使用了algo.shortestPath.deltaStepping.stream算法

PROFILE MATCH (start:ReferencePlace {name:'Paris'})
CALL algo.shortestPath.deltaStepping.stream(start, 'distance', 3.0, {relationshipQuery: 'EROAD'})
YIELD nodeId, distance
WHERE distance <= 800
RETURN algo.asNode(nodeId) AS destination, distance

这似乎在做我想要的事情,即使从概念上讲这并不是解决问题的直接方法。将看到它如何缩放更大的图。