Neo4j中的字符串比较

Neo4j中的字符串比较,neo4j,cypher,Neo4j,Cypher,我想知道where子句中以下字符串比较的性能: 案例1: MATCH (p: Person) WHERE NOT p.name='Person 1' AND NOT p.name='Person 2' RETURN p MATCH (p: Person) WHERE NOT (p.name='Person 1' OR p.name='Person 2') RETURN p MATCH (p: Person) WHERE NOT p.name IN ['Person 1', 'Person 2

我想知道where子句中以下字符串比较的性能:

案例1:

MATCH (p: Person)
WHERE NOT p.name='Person 1'
AND NOT p.name='Person 2'
RETURN p
MATCH (p: Person)
WHERE NOT (p.name='Person 1' OR p.name='Person 2')
RETURN p
MATCH (p: Person)
WHERE NOT p.name IN ['Person 1', 'Person 2']
RETURN p
案例2:

MATCH (p: Person)
WHERE NOT p.name='Person 1'
AND NOT p.name='Person 2'
RETURN p
MATCH (p: Person)
WHERE NOT (p.name='Person 1' OR p.name='Person 2')
RETURN p
MATCH (p: Person)
WHERE NOT p.name IN ['Person 1', 'Person 2']
RETURN p
案例3:

MATCH (p: Person)
WHERE NOT p.name='Person 1'
AND NOT p.name='Person 2'
RETURN p
MATCH (p: Person)
WHERE NOT (p.name='Person 1' OR p.name='Person 2')
RETURN p
MATCH (p: Person)
WHERE NOT p.name IN ['Person 1', 'Person 2']
RETURN p
我在我的数据库上尝试过,但结果并不一致,有时情况3得到最佳响应时间和db命中率,有时情况1和情况2最好

你能帮我说清楚吗?
-哪种方法的性能最好?

-为什么它是最好的(可能是背后的算法/逻辑)?

情况3应该总是产生最少的DB命中。如果您
PROFILE
每个查询,它们通常都会生成相同的执行计划,但是如果您查看
Filter
操作中的详细信息,您可以看到差异

在案例1和2中,过滤器比较是
而不是p.name=$
AUTOSTRING0`

但是,如果您查看案例3的概要文件,它有一个不同的比较

在案例3中,$AUTOLIST0`中的过滤器比较是
而不是p.name

可以推断,案例1和案例2将每个新术语视为单独的字符串比较,但案例3执行列表比较。如果按比例放大人员anmes的lst,则案例3中的DB命中率将保持不变,但案例1和案例2将线性放大

随着数据库的增长,这个查询将永远不会是一个“出色的执行者”,尽管它确实会对一个特定的标签进行完整的表扫描,并过滤掉它不想要的东西


就响应时间而言,第一次运行其中一个查询时,结果会出现在页面缓存中,因此后续查询总是会更快。同样,一旦执行了每个查询,查询计划将被缓存,因此在比较它们时,它只会有一点变化。

案例3应始终产生最少的数据库命中。如果您
PROFILE
每个查询,它们通常都会生成相同的执行计划,但是如果您查看
Filter
操作中的详细信息,您可以看到差异

在案例1和2中,过滤器比较是
而不是p.name=$
AUTOSTRING0`

但是,如果您查看案例3的概要文件,它有一个不同的比较

在案例3中,$
AUTOLIST0`中的过滤器比较是
而不是p.name

可以推断,案例1和案例2将每个新术语视为单独的字符串比较,但案例3执行列表比较。如果按比例放大人员anmes的lst,则案例3中的DB命中率将保持不变,但案例1和案例2将线性放大

随着数据库的增长,这个查询将永远不会是一个“出色的执行者”,尽管它确实会对一个特定的标签进行完整的表扫描,并过滤掉它不想要的东西


就响应时间而言,第一次运行其中一个查询时,结果会出现在页面缓存中,因此后续查询总是会更快。同样,一旦执行了每个查询,查询计划将被缓存,因此在比较它们时会有一些变化。

非常感谢,Dave,但是如果我必须创建这样的过滤器,并且所需属性的唯一值的数量非常少,那么最好的策略是什么?索引是没有意义的,因为属性不是那么有选择性。非常感谢,Dave,但是如果我必须创建这样的筛选器,并且所需属性的唯一值的数量非常少,那么最好的策略是什么?索引是没有意义的,因为属性不是那么有选择性。