【问题标题】:Neo4j Cypher Performance of Optional Match可选匹配的 Neo4j Cypher 性能
【发布时间】: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 行

我的问题是

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

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

【问题讨论】:

  • 您确定这些查询之间存在差异吗?在启动 shell 后的前几次查询中,其他事情正在发生(例如预填充缓存等)。在决定什么是快什么是慢之前,请小心重复运行两者,以消除来自热/冷缓存的差异。
  • 我每个查询运行了大约 4 次,并发布了最后一次运行的时间。

标签: neo4j cypher


【解决方案1】:

使用 Union 语句怎么样?

匹配(s:状态)
返回
联盟 MATCH (s:State)(vote:Vote)-[:FOR]->(:Election{id:'ABC123'}) RETURN s, count(vote)

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

Union Docs
Optional Match Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多