使用Neo4j的Java API 3.1.0-M08版本,我使用Dijkstra算法构建了一个最短路径搜索。我有很多数据,磁盘上有28 GB。节点代表城市,关系代表连接。通常,城市将拥有非常多的连接。在我的PathExpander
中,我排除了大量关系,导致整个图形中只有一小部分被遍历。然而,搜索表现得非常糟糕:
Relations traversed: 5343
Duration: ~14s
Performance: 373 relations/s
这是热身运行的热门方法的分析结果:
类型PathExpander
,CostEvaluator
和Long
的{{1}}和Integer
读取属性。我尝试将来自Double
的来电替换为getProperty
并且没有帮助。
使用以下JVM参数启动应用程序:getAllProperties
。我有一个相当快的SSD,我确保在测量之前通过运行相同的搜索几次来预加载缓存。从第二次运行开始,我看不到磁盘活动,这意味着遍历的图应该在RAM中。
我使用默认参数调用-Xmx10g -Xms10g
。自定义配置能提高性能吗?请注意,我只有16 GB RAM用于测试目的。
答案 0 :(得分:0)
问题是每个城市节点都连接了很多连接关系。尽管许多关系被排除在外,但为了排除它们,必须阅读其中的每一个。解决方案是改变模型。新模型如下:
(:City)-[:ConnectionDay {day: {day}}]->(:ConnectionDay)-[:Connection]->(:City)
因为只能考虑特定日期的连接,所以不会触及不同日期的所有连接。