Neo4j Cypher可选配比赛的表现

时间:2014-09-18 17:49:05

标签: neo4j cypher

我试图编写一个查询来计算按其投放状态分组的选举的总投票数。 我希望即使有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行

我的问题是

  1. 为什么两个查询之间的性能差异如此之大?

  2. 是否有更好的方法来构建查询以提高性能并仍满足要求?

1 个答案:

答案 0 :(得分:0)

使用Union语句怎么样?:

  

MATCH(s:State)
  返回   联盟   MATCH(s:State)&lt; - [:FROM] - (:User) - [:CAST] - &gt;(投票:投票) - [:FOR] - &gt;(:Election {id:&#39; ABC123& #39;})   返回,计数(投票)

我认为由于可选匹配与计数(投票)操作的机制相关,您的查询可能需要很长时间。我不确定这是否会更快,但值得一试。

Union Docs
Optional Match Docs