我在针对Neo4j 2.2的查询调优中发现this guide,该指南中的提示之一是,当查找是否存在关系时,该查询:
size((n)-[:DIRECTED]->()) <> 0
比此查询快:
EXISTS((n)-[:DIRECTED]->())
在我看来,发现关系的总数比确定关系是否根本存在要快,这是违反直觉的。我的问题是-EXISTS
在Neo4j的更高版本中是否已优化,因此不再需要此技巧?如果不是,那么这两个函数之间的区别是什么,它们使size()变得更快?
答案 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(*);