1

我需要衡量任何查询的性能。

例如 :

MATCH (n:StateNode)-[r:has_city]->(n1:CityNode)
WHERE n.shortName IN {0} and n1.name IN {1} 
WITH n1
Match (aa:ActiveStatusNode{isActive:toBoolean('true')})--(n2:PannaResume)-[r1:has_location]->(n1)
WHERE (n2.firstName="master") OR (n2.lastName="grew" )
WITH n2  
MATCH (o:PannaResumeOrganizationNode)<-[h:has_organization]-(n2)-[r2:has_skill]->(n3:Skill)
WHERE (0={3} OR o.organizationId={3}) AND (0={4} OR n3.name IN {2} OR n3.name IN {5}) 
WITH size(collect(n3)) as count, n2 
MATCH (n2) where (0={4} OR count={4}) 
RETURN DISTINCT n2 

我已经尝试过profile & explain子句,但它们只返回 db hits 的数量。是否有可能为 neo4j 查询获得大符号,即我们根据大 O 符号来衡量性能?除了使用profile & explain之外,还有其他方法可以检查查询性能吗?

4

3 回答 3

1

不,您不能将 Cypher 转换为 Big O 表示法。

Cypher 没有描述如何获取信息,只描述了你想要返回什么样的信息。由 Neo4j 数据库中的 Cypher 规划器将 Cypher 转换为可执行查询(使用关于它必须找到什么信息、可用索引以及关于被查询数据集的内部统计信息的启发式方法。所以只需更改数据库的状态可以改变 Cypher 的复杂性。)

Cypher 就是一个非常简单的例子Cypher 3.1 MATCH (a{id:1})-[*0..25]->(b) RETURN DISTINCT b。使用具有循环的相当平均的连通图,针对 Neo4j 3.1.1 运行会因为过于复杂而超时(因为规划器试图找到所有路径,即使它不需要那些冗余信息),而 Neo4j 3.2.3 会返回非常快(因为 Planner 认识到它只需要像深度优先搜索一样进行图形扫描来查找所有连接的节点)。


旁注,您可以争论返回结果的大 O 表示法。例如MATCH (a), (b)必须具有 n^2 的最小复杂度,因为结果是笛卡尔积,并且执行不能比答案更复杂。这种对复杂性如何影响行数的理解可以帮助您编写 Cypher,从而减少 Planner 最终计划的工作量。

例如,使用WITH COLLECT(n) as data MATCH (c:M)来减少规划器在 Cypher 的下一部分之前完成的工作的行数,从 nm(第一次匹配计数乘以第二次匹配计数)到 m(1 次匹配计数)。

但是,由于 Cypher 没有承诺如何找到数据,因此无法保证执行的复杂性。我们只能尝试编写更有可能得到最优执行计划的 Cyphers,并使用 EXPLAIN/PROFILE 来评估规划器是否能够找到相对最优的解决方案。

于 2018-09-14T17:17:31.597 回答
0

没有任何东西是现成的。但它可以通过一些额外的努力推导出/近似。

在分析查询时,我们会得到 neo4j 将运行以实现所需结果的函数列表。理论上,这个函数中的每一个都与最坏到最好的情况复杂性相关联。其中一些也将并行运行。这将影响运行时,具体取决于您的服务器拥有的内核。

例如 match (a:A) match (a:B) 结果为笛卡尔积。这将是 O(count(a)*count(b))

同样,您的查询计划中的每个功能确实具有这样的时间复杂性。

因此,这些函数的各个时间复杂度的聚合将为您提供查询时间复杂度的总体近似值。

但这会随着 neo4j 的每个版本不时改变,因为他们的社区总是可以更改查询的植入或实现更好的运行时/结构更改/并行化/更少的 ram 使用。

如果您正在寻找的结果是表明 Neo4j 查询的优化,那么 db-hits 是一个很好的指标。

于 2019-05-06T05:18:29.543 回答
0

PROFILE 结果向您展示了 neo4j 服务器实际计划如何处理您的 Cypher 查询。您需要分析 PROFILE 结果揭示的执行计划以获得大 O 复杂度。我知道没有工具可以做到这一点(尽管有人创建一个工具是个好主意)。

您还应该知道,查询的执行计划可能会随着 DB 特征的变化而随时间变化,并且在更改为不同版本的 neo4j 时也会发生变化。

于 2018-09-12T20:59:35.060 回答