我目前正在使用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;中执行。时间而不限制关系数量?
答案 0 :(得分:1)
我担心使用Cypher会做得更好。
但是,您可以使用Java中的traversal framework做得更好。请参阅这篇由两部分组成的博客文章,比较Cypher对Dijkstra算法的实现(类似问题,仅使用固定的开始和结束节点而不是开放式结束)APOC's:part 1和{{3 }}
使用遍历,您可以在遍历时计算的费用,这样您就可以:
您可以使用Map<Node, Double>
来收取费用,但如果您的图表足够大,则使用原始地图(例如part 2,fastutil,Trove, HPPC等)将使用更少的内存并且通常更快(更紧凑,更少装箱和拆箱;只需使用节点的long
id作为密钥)。
遍历完成后,您只需将地图反转为成本和相关终端节点的多重图,即可获得结果。
它比执行Cypher查询更复杂,但它会更快,更快。