0

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

我的图表包含大约 400 万个节点和数亿个关系。我的测试只是发送一个查询,计算一个节点的入站关系数。

该程序使用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 的查询花费了 1 毫秒,但是当我打印一些日志消息时,我可以看到它实际上花费了 917 毫秒。

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

提前致谢!

4

2 回答 2

1

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

现在你必须在外部计时。

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

于 2013-02-18T04:48:23.110 回答
1

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

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

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

start n=node:node_auto_index(id="United States") 
return length(()-[:QUOTES]->n) as cnt
于 2013-02-20T07:11:42.993 回答