我有以下查询:
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,规划者:成本,运行时:解释。2773 4 ms中的总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,规划者:成本,运行时:解释。7818908 6747 ms中的总计db点击率
差别很大-- 4 ms vs 6747 ms

为什么它与这个额外的Cypher指令工作这么长时间,以及如何优化它?
发布于 2017-12-13 09:37:10
我认为这与sum()操作有关,他们在计划中添加了一个EagerAggregation。
如果没有sum()操作,就会有10的限制。一旦获得第一个完整的记录,结果就可以开始流回给您,并在第10次访问时停止。规划师可能很懒,无论是在何时开始返回记录,以及在遇到第10条记录之后都可以停止,因此不需要找到所有的结果,然后再得到第10条的第一条。
但是,当您有一个迫切的聚合(如sum() (对于collect()也是一样)时,您不能这样做。为什么?因为仅仅使用childD、dg和vg只拥有一张记录是不够的。求和取决于使用相同的childD、dg和vg变量获得的每个其他记录,因此权重和总票数可以在所有这些记录中相加。而唯一的方法,你知道你有所有的记录,你需要的总和是准确的是,首先得到所有的结果。然后,当总结完成后,前10条记录被拿走,其余的被丢弃。
https://stackoverflow.com/questions/47780804
复制相似问题