【问题标题】:Neo4j Cypher performance query optimizationNeo4j Cypher 性能查询优化
【发布时间】:2017-12-12 20:13:39
【问题描述】:

我有以下疑问:

MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) 
WHERE dg.id = 1 
MATCH (childD)-[relationshipValueRel4:HAS_VALUE_ON]-(filterCharacteristic4:Characteristic) 
WHERE filterCharacteristic4.id = 4 
WITH relationshipValueRel4, childD, dg 
WHERE  (ANY (id IN [2,3] 
WHERE id IN relationshipValueRel4.optionIds ))  
WITH childD, dg  
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion) 
WHERE c.id IN [2, 3] 
WITH childD, dg, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
RETURN childD LIMIT 10

此查询的个人资料:

Cypher 版本:CYPHER 3.3,规划器:COST,运行时:INTERPRETED。 2773 4 毫秒

内的总 db 命中

但是当我再添加一行查询时:WITH childD , dg , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes

查询看起来像:

MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) 
WHERE dg.id = 1 
MATCH (childD)-[relationshipValueRel4:HAS_VALUE_ON]-(filterCharacteristic4:Characteristic) 
WHERE filterCharacteristic4.id = 4 
WITH relationshipValueRel4, childD, dg 
WHERE  (ANY (id IN [2,3] 
WHERE id IN relationshipValueRel4.optionIds ))  
WITH childD, dg  
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion) 
WHERE c.id IN [2, 3] 
WITH childD, dg, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH childD , dg , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes  
RETURN childD LIMIT 10

个人资料如下:

Cypher 版本:CYPHER 3.3,规划器:COST,运行时:INTERPRETED。 6747 ms

内 7818908 次总 db 命中

差异非常大 - 4 ms vs 6747 ms

为什么它与这个额外的 Cypher 指令一起工作这么长时间以及如何优化它?

【问题讨论】:

  • 您能否为其他查询添加 PROFILE 计划,以及哪个是哪个标签?
  • @InverseFalcon 我有第一个查询的 PROFILE 计划

标签: neo4j cypher


【解决方案1】:

我相信这与 sum() 操作有关,他们在计划中添加了 EagerAggregation。

如果没有sum() 操作,您有 LIMIT 10。一旦获得第一个完整记录,结果就可以开始流式传输给您,并在您达到第 10 个时停止。计划器可以是懒惰的,无论是什么时候开始返回记录,也可以在遇到第 10 条记录后停止,无需查找所有结果然后获取第 10 片。

但是,当您有一个像 sum() (collect() 相同)这样的热切聚合时,您不能这样做。为什么?因为仅仅拥有一条包含 childD、dg 和 vg 的记录是不够的。求和取决于使用相同的 childD、dg 和 vg 变量获得的所有其他记录,因此可以将所有这些记录的权重和总票数相加。要知道您拥有使总和准确所需的所有记录,唯一的方法是首先获得所有结果。然后当总和完成时,前 10 条记录被取出,其余的则丢弃。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多