Cypher:使用 WHERE 子句或 MATCH 属性定义进行精确匹配?

Posted

技术标签:

【中文标题】Cypher:使用 WHERE 子句或 MATCH 属性定义进行精确匹配?【英文标题】:Cypher: Use WHERE clause or MATCH property definition for exact match? 【发布时间】:2016-05-14 10:56:06 【问题描述】:

在 Neo4j(3.0 版)中,以下查询返回相同的结果:

1. MATCH (a:Label) WHERE a.property = "Something" RETURN a
2. MATCH (a:Label property: "Something") RETURN a

在处理一些大型数据集时,我注意到(并使用EXPLAINPROFILE 进行了验证)在某些情况下,像第二个这样的查询执行得更好更快。虽然存在两个版本表现相同的其他实例,但我还没有看到第一个版本表现更好的实例。

neo4j 的文档和教程也是分开的。两者之间没有明确的比较。 docs 和 tuts 使用这两个版本,通常倾向于第一个(可能是因为非精确匹配只能使用WHERE 子句完成)。但指南还规定,越早缩小搜索范围,搜索速度就越快。

    两个版本总是返回相同的结果,我说得对吗? 第二个版本通常会表现得更好,因为它更早地缩小了搜索范围,我说得对吗?

【问题讨论】:

【参考方案1】:
    是的 不,两者的计算结果基本上是相同的查询计划。由于 Neo4j 使用基于成本的优化器,查询计划可能会随着时间的推移而改变,因为优化器考虑改变(也许现在有更多的数据,所以索引查找比 NodeByLabelScan 便宜)。

【讨论】:

以上是关于Cypher:使用 WHERE 子句或 MATCH 属性定义进行精确匹配?的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j 第九篇:查询数据(Match)

Cypher 查询中的多个 MATCH 子句和逗号有啥区别?

为啥 Cypher 中的变量需要提醒 `WITH` 子句?

Cypher学习《一》

用cypher构建规则

使用cypher返回多个关系权重