【发布时间】:2014-09-18 17:49:05
【问题描述】:
我正在尝试编写一个查询来计算按投票所在州分组的选举的总票数。 即使有 0 票,我也希望返回所有状态。以下查询使用可选匹配返回所有状态,无论是否有任何投票。
MATCH (state:State)
OPTIONAL MATCH (state)<-[:FROM]-(:User)-[:CAST]->(vote:Vote)-[:FOR]->(:Election{id:'ABC123'})
RETURN state, count(vote)
在 3064 毫秒内返回 50 行。
如果我删除可选匹配,查询会执行得更好:
MATCH (state:State),(state)<-[:FROM]-(:User)-[:CAST]->(vote:Vote)-[:FOR]->(:Election{id:'ABC123'})
RETURN state, count(*)
在 406 毫秒内返回 49 行。
我的问题是
为什么两个查询之间的性能差异如此之大?
有没有更好的方法来构建查询以提高性能并仍然满足要求?
【问题讨论】:
-
您确定这些查询之间存在差异吗?在启动 shell 后的前几次查询中,其他事情正在发生(例如预填充缓存等)。在决定什么是快什么是慢之前,请小心重复运行两者,以消除来自热/冷缓存的差异。
-
我每个查询运行了大约 4 次,并发布了最后一次运行的时间。