【问题标题】:Count performance with Neo4j using embedded java API使用嵌入式 java API 计算 Neo4j 的性能
【发布时间】:2013-02-18 04:24:58
【问题描述】:

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

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

这个程序使用 ExecutionEngine execute 程序发送以下查询:

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 毫秒来完成其余部分,比如计算关系的数量。在这种情况下,如何获得此查询的 getter 性能?

提前致谢!

【问题讨论】:

  • 您可以在创建时将 rels 的数量存储在节点上,或者在添加/删除关系时更新它。

标签: neo4j


【解决方案1】:

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

现在你必须在外部计时。

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

【讨论】:

  • 很好,我实际上使用的是 1.8.1。多谢!关于性能,917ms 对于这种类型的查询是否正常?关于如何改进它的任何想法?
  • 感谢您的更新。实际上,这个图表在我的应用程序中将保持静态,所以我应该更好地将入站/出站的数量存储在其他地方!最佳
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多