Neo4j查询优化

时间:2015-04-07 12:00:05

标签: neo4j

在Neo4j Graph Academy(http://neo4j.com/graphacademy/online-course/)我在“(L2) - (聚合)”部分阅读:

  

通常,您对前n个结果感兴趣,这些结果来自计数聚合。这是通过首先计数并以DESCending方式对结果进行排序然后通过前n来限制结果来实现的。如果我们对前十位演员感兴趣,那么他们的观点就像这样。

MATCH (a:Person)-[:ACTED_IN]->(m)
RETURN a.name, count(m)
ORDER BY count(m) DESC
LIMIT 10;

但是,我想知道它是否足够聪明,不能计算多次计数(m),即如果语法类似于以下更好:

MATCH (a:Person)-[:ACTED_IN]->(m)
RETURN a.name, count(m) AS c
ORDER BY c DESC
LIMIT 10;

1 个答案:

答案 0 :(得分:4)

答案是查询计划完全相同,一个并不比另一个好。

在查询之前使用PROFILE关键字,您可以询问neo4j如何执行每个查询。因此,请不要相信我的话,对这两个查询进行分析,看看这些计划是否有所不同。如果他们不是,那么两者的执行将是相同的。

这是查询配置文件的样子:

Query execution plan

我认为count()发生在EagerAggregation,并且它发生在top操作之前,无论您如何表达该计数。

Cypher查询优化最近取得了进展。在2.2版本中,有一个新的基于成本的规划器。我不知道这个特定的查询是否与新的基于成本的计划代码有关(实际上可能不是),但更重要的是,如果查询语言的优化器运行良好,那么真的不应该&这两个查询之间有任何区别。请参阅,如果两个查询语义等效,那么优化程序的工作总是将您的查询重新写入其自身执行速度最快的版本,该版本在语义上是等效的。

这为你写一些不完美的密码提供了一些余地,但仍能取得好成绩。一般来说,在你遇到真正的性能问题之前,我不会过度复杂你的查询以加快它们的速度("过早的优化是所有邪恶的根源")。如果您想知道查询的其他公式是否有帮助,请使用PROFILE