我有以下图形结构
Java版本
Neo4j版本
机器
问题
我正在用三个查询做一些实验。#1耗时16秒,#2耗时8分钟,#3崩溃。#2和#3都将所有可用的CPU内核的使用率提高到了90%。我正在使用Web界面来评估这些查询(我将使用RESTAPI将应用程序与neo4j集成)
我想知道这些查询有什么问题以及如何优化它们。我目前正在使用默认设置。
START root=node:source(id="2")
MATCH root-[]->movies<-[]-others
WITH COUNT(movies) as movie_count, others as others
RETURN others.id, movie_count
ORDER BY movie_count DESC
LIMIT 10
START root=node:source(id="2")
MATCH
root-[]->stuff<-[]-others
WITH DISTINCT(others) as dothers
MATCH dothers-[]->different
RETURN different.id, COUNT(different) as count
ORDER BY count DESC
LIMIT 10
START root=node:source(id="2")
MATCH root-[*1..1]->stuff<-[*1..1]-other-[*1..1]->different
WHERE stuff.id <> different.id
WITH COUNT(different) as different_count, different as different
RETURN different.id, different_count
ORDER BY different_count DESC
LIMIT 10
免责声明:此建议适用于1.8和1.9。如果您使用的是2.0或2.1,这些评论可能不再有效。
查询1:使用您的返回,并跳过该额外步骤。
查询2:不要像现在这样在与中做不同。在不做不同的情况下尽可能地走。这看起来像是查询中过早的优化,使其不懒惰,并且必须存储更多的中间结果来计算与结果。
疑问3:不要做-[*1…1]-
如果您需要更快的响应,并且无法通过我的建议从查询中挤出它,您可能需要转向JavaAPI,直到2. x中的Cypher性能改进。非托管扩展方法使这些易于从REST接口调用。
在寻找性能时,请使用Neo4j的最新稳定版本(编写此答案时的时间点为1.9. x)。
2.0.0。M03是一个里程碑式的构建,尚未优化。到目前为止,重点是关于标签和基于标签的索引的新概念的功能完整性。