我开始测试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性能?
提前致谢!
答案 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