2013-02-18 26 views
0

我开始测试Neo4j的一个程序,我面临一些性能问题。如标题所述,Neo4j直接嵌入在Java代码中。使用嵌入式Java API计算性能Neo4j

我的图包含大约4百万个节点和数亿个关系。我的测试只是发送一个查询来统计一个节点入站关系的数量。

该程序使用ExecutionEngine执行程序发送以下查询:

start n=node:node_auto_index(id="United States") match s-[:QUOTES]->n return count(s) 

通过简单地增加一些版画,我可以看到多少时间,这个查询了这通常是约900毫秒这是很多。

最令我惊讶的是,我收到了一个“查询执行时间”的响应,这实际上是不同的。

例如查询返回:

+----------+ 
| count(n) | 
+----------+ 
| 427738 | 
+----------+ 
1 row 
1 ms 

根据这种反应,我undertand是Neo4j的花为1ms的查询,但是当我打印了一些日志消息,我可以看到,它实际上花了917ms。

我想1ms等于找到索引对象“美国”所需的时间,这意味着Neo4j需要大约916ms的时间,比如计算关系的数量。在这种情况下,如何获得此查询的getter性能?

在此先感谢!

+1

您可以在创建时在节点上存储rels的数量,或者在添加/删除关系时更新它。 – 2013-02-20 07:10:20

回答

1

查询计时器在1.8.1和1.9.M04中被打破,当时密码的懒惰东西被修复了。 (绝大多数用例都是值得的交易)。但是,我认为这个问题很快就会解决。

现在,你必须在外部计时。

更新: 至于你提到当时是否合理的问题......它基本上需要扫描所有〜400K节点指望他们。这可能是合理的,即使缓存被预热并且所有这些都适合RAM。如果能够避免这种“超级节点”,通常不是最佳实践,尽管他们将在未来的版本中为这种情况做出很多改进(至少,这正是我所听到的)。

+0

好的,我真的使用1.8.1。非常感谢!关于表演,这种类型的查询对917ms似乎是正常的吗?任何想法,我如何可以改善呢? – 2013-02-18 15:58:30

+0

@A_dit_rien添加了更新。 – 2013-02-18 21:00:47

+0

感谢您的更新。实际上,这个图表在我的应用程序中保持静态,所以我应该更好地存储其他地方的入站/出站数量!最好 – 2013-02-18 21:30:40

1

确保不要测量第一个查询b/c,即只测量将磁盘中的数据加载到内存所需的时间。

确保给Neo4j足够的内存来缓存您的数据。

并尝试此查询,如果它更快。

start n=node:node_auto_index(id="United States") 
return length(()-[:QUOTES]->n) as cnt