Neo4j:Cypher性能测试/基准测试

时间:2017-01-13 16:25:07

标签: neo4j cypher

我创建了一个Neo4j 3数据库,其中包含一些测试数据以及一个将http cypher请求发送到Neo4j的小应用程序。这些请求始终是同一时间。它实际上是一个查询模板,它只是因某些属性而异。我对这些陈述的表现感兴趣。 我知道我可以使用PROFILE在浏览器中获取一些信息。但是我想执行一组语句,例如: G。 10个示例查询,多次并计算平均性能。有没有简单的方法或工具来做这个或我必须写e。 G。收集这些值的Python脚本?它不一定是一个大的应用程序,我只是想看一些一般的性能指标。

1 个答案:

答案 0 :(得分:2)

我不认为现在还有用于对Neo4j进行基准测试的开箱即用工具。因此,您最好的选择是实施自己的解决方案 - 但如果您想获得(某种程度上)代表性的结果,您必须要小心:

  1. 检查docs on performance

  2. 为Neo4j JVM提供足够的时间进行预热。这意味着您将要使用查询运行预热阶段并放弃它们的执行时间。

  3. 您也可以选择在嵌入模式下使用Neo4j,而不是使用客户端 - 服务器架构,这样可以更好地了解查询性能(无需驱动程序的开销和序列化/反序列化过程) )。但是,在这种情况下,您必须通过JVM(在Java或可能是Jython中)实现基准测试。

  4. 多次运行每个查询。 不要使用平均值,因为它对异常值更敏感(出于多种原因,您可以获得高值,例如,如果OS调度程序在特定查询执行期间在后台启动某些作业)。

    主题中的一篇好文章How not to lie with statistics: the correct way to summarize benchmark results认为你应该使用几何平均值。

    在计算机科学论文的性能实验中使用中值也是常见的做法。我倾向于使用这个选项 - 例如此图显示了内存RDF引擎(Jena和Sesame)上的两个简单SPARQL查询的执行时间,这些查询是针对它们的首次执行以及连续5次执行的中间值。

  5. 但是请注意,Neo4j采用了各种缓存机制,因此如果您只运行多次相同的查询,则只需要在第一次执行时计算结果,后续执行将使用缓存 - 除非数据库在查询执行之间更新。

  6. 作为一个很好的近似,您可以将基准设计为尽可能接近实际工作量 - 在许多情况下,application-specific macrobenchmarks make more sense than microbenchmarks。因此,如果每个查询仅由应用程序评估一次,那么仅对第一次评估进行基准测试是完全可以接受的。

  7. (Bonus。)该主题的另一个好读物是The Benchmark Handbook - 第1章讨论了特定于域的基准(相关性,可移植性,可伸缩性和简单性)的最重要标准。这些可能不是您的基准测试所必需的,但现在这些都很好。

  8. 我在考虑关系,图形和语义数据库(包括Neo4j)的跨技术基准测试中工作。您可能会在存储库中找到一些有用的想法或代码片段:https://github.com/FTSRG/trainbenchmark