size()仍然比neo4j中的EXISTS快吗?

时间:2018-07-09 21:38:22

标签: neo4j cypher

我在针对Neo4j 2.2的查询调优中发现this guide,该指南中的提示之一是,当查找是否存在关系时,该查询:

size((n)-[:DIRECTED]->()) <> 0

比此查询快:

EXISTS((n)-[:DIRECTED]->())

在我看来,发现关系的总数比确定关系是否根本存在要快,这是违反直觉的。我的问题是-EXISTS在Neo4j的更高版本中是否已优化,因此不再需要此技巧?如果不是,那么这两个函数之间的区别是什么,它们使size()变得更快?

1 个答案:

答案 0 :(得分:3)

Cypher查询计划者不断改进,引用的性能差异(neo4j 2.2中存在)不再存在。

例如,在neo4j 3.4.1中使用PROFILE,这两个查询现在产生了基本相同的有效执行计划(使用度数):

PROFILE
MATCH (n:Person) WHERE SIZE((n)-[:DIRECTED]->()) > 0
RETURN count(*);

PROFILE
MATCH (n:Person) WHERE EXISTS((n)-[:DIRECTED]->())
RETURN count(*);