使用嵌入式Java API计算Neo4j的性能

时间:2013-02-18 04:24:59

标签: neo4j

我开始测试Neo4j的程序,我遇到了一些性能问题。正如标题中所提到的,Neo4j直接嵌入在java代码中。

我的图表包含大约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 

根据这个回复,我认为Neo4j花了1ms进行查询,但是当我打印一些日志消息时,我发现它实际需要917ms。

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

查询计时器在1.8.1和1.9.M04中被破解,当时密码懒惰的东西被修复了。 (对于大多数用例来说绝对是一个有价值的交易)。但是,是的,我认为很快就会解决。

现在你必须在外面计时。

<强>更新: 至于你关于时间是否合理的问题......它基本上需要扫描所有~400k节点来计算它们。这可能是合理的,即使缓存已预热并且所有这些都适合RAM。拥有这样的“超级节点”通常不是最佳实践,如果可以避免的话,尽管它们将在未来的版本中为这种情况做出很多改进(至少,这就是我所听到的)。

答案 1 :(得分:1)

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

确保为Neo4j提供足够的内存来缓存数据。

如果速度更快,请尝试此查询。

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