Neo4j Isochrones改进

时间:2016-10-13 16:38:02

标签: neo4j spatial

我目前正在使用Neo4j和PostGIS上的等时线。

我在neo4j中遇到的问题是我对计算等时线的查询效率不高。

match (n:node) where n.id_gis='155'
with n
match path=(n)-[*0..15]-(e)
with e, min(reduce(cost=0.0, r IN rels(path) | cost + toFloat(r.cost2)*3600)) as cost
where cost < 30
return cost, collect(e) as isochrones
order by cost

正如您在上面的代码中所看到的,我目前限制了最大跳数,否则它会在计算最大成本之前搜索数据库中的所有可能路径。

有没有人知道我如何更改/改进我的查询,以便它将在&#34; normal&#34;中执行。时间而不限制关系数量?

1 个答案:

答案 0 :(得分:1)

我担心使用Cypher会做得更好。

但是,您可以使用Java中的traversal framework做得更好。请参阅这篇由两部分组成的博客文章,比较Cypher对Dijkstra算法的实现(类似问题,仅使用固定的开始和结束节点而不是开放式结束)APOC'spart 1和{{3 }}

使用遍历,您可以在遍历时计算的费用,这样您就可以:

  • 在达到最高费用后立即修剪分支
  • 收集目前为止终端节点的最佳成本,如果当前分支的成本低于同一终端节点的最佳成本,则修剪分支

您可以使用Map<Node, Double>来收取费用,但如果您的图表足够大,则使用原始地图(例如part 2fastutilTroveHPPC等)将使用更少的内存并且通常更快(更紧凑,更少装箱和拆箱;只需使用节点的long id作为密钥)。

遍历完成后,您只需将地图反转为成本和相关终端节点的多重图,即可获得结果。

它比执行Cypher查询更复杂,但它会更快,更快。