2016-09-16 23 views
1

使用Neo4j的Java API版本3.1.0-M08,我使用Dijkstra算法构建了最短路径搜索。我有很多数据,磁盘上有28 GB。节点代表城市,关系代表连接。通常情况下,一个城市将有很多的连接。在我的PathExpander中,我排除了大量关系,导致遍历整个图的只有很小的一部分。尽管如此,搜索执行不亦乐乎:Neo4j Java API:Bad Dijkstra性能

Relations traversed: 5343 
Duration: ~14s 
Performance: 373 relations/s 

这是剖析热身运行的热方法是这样的:

enter image description here

PathExpanderCostEvaluator阅读Long类型,Integer的性质和Double。我试图用getAllProperties替换getProperty的呼叫,但没有帮助。

该应用程序使用以下JVM参数启动:-Xmx10g -Xms10g。我有一个相当快速的固态硬盘,并且确保在测量之前通过运行相同的搜索几次来预加载高速缓存。从第二次运行开始,我看不到磁盘活动,这意味着遍历的图应该在RAM中。

我使用默认参数调用GraphDatabaseFactory。定制配置可以提高性能吗?请注意,我只有16 GB RAM用于测试目的。

回答

0

问题是每个城市节点都连接到了很高的连接关系。尽管很多关系被排除在外,为了排除它们,每一个关系都必须被阅读。解决方案是改变模型。新的模型如下所示:

(:City)-[:ConnectionDay {day: {day}}]->(:ConnectionDay)-[:Connection]->(:City) 

因为在某一天只接可以考虑,在不同的日子所有的连接都没有碰过。