Neo4j Cypher IN运算符与等效运算符的性能降低

时间:2014-05-20 15:26:18

标签: neo4j cypher

考虑以下问题:

MATCH (task:Task)--(assignment:Assignment)
WHERE task.Uid IN ['7d261f24-781b-4bf7-a1a5-ab8987d51164']
RETURN assignment

在我们的数据库中,我们有大约750,000个任务和1100个任务。

此查询的效果在12-13秒范围内运行,索引位于Task.Uid

但是,此查询在10-20ms范围内运行:

MATCH (task:Task)--(assignment:Assignment)
WHERE task.Uid = '7d261f24-781b-4bf7-a1a5-ab8987d51164'
RETURN assignment

我原本希望这两个查询以相同的速度运行,但似乎查询引擎对它们的处理方式却截然不同,即使在这种情况下,集合长度为1,查询也是一样的。

我尝试过将IN切换为使用OR等变体,但在这种情况下效果相同(12-13s):

MATCH (task:Task)--(assignment:Assignment)
WHERE task.Uid = '7d261f24-781b-4bf7-a1a5-ab8987d51164' 
    OR task.Uid = '971b786e-01ae-4726-a0f6-d0bc494df167'
RETURN assignment

但是,此查询执行与等于查询相同的(10-20ms):

MATCH (task1:Task)--(assignment1:Assignment),
    (task2:Task)--(assignment2:Assignment)
WHERE task1.Uid = '7d261f24-781b-4bf7-a1a5-ab8987d51164' 
    AND task2.Uid = '971b786e-01ae-4726-a0f6-d0bc494df167'
RETURN assignment1, assignment2

问题是,是否有任何方法可以使用Cypher更优雅地编写第二个查询?

我想我也很困惑为什么INOR在这种情况下没有被翻译成索引查找,而等于运算符是。

2 个答案:

答案 0 :(得分:1)

不幸的是,目前缺少实施。 :(

您可以在类型(2)

的多个查询之间使用类似于上一种方法的内容,或者更好的UNION
MATCH (task:Task)--(assignment:Assignment)
WHERE task.Uid = '7d261f24-781b-4bf7-a1a5-ab8987d51164' 
RETURN assignment
UNION
MATCH (task:Task)--(assignment:Assignment)
WHERE task.Uid = '971b786e-01ae-4726-a0f6-d0bc494df167'
RETURN assignment

答案 1 :(得分:0)

这已在2.1.2发布版本中解决:

http://neo4j.com/blog/neo4j-2-1-2/?_ga=1.172697573.754304541.1400274053

  

Cypher使用索引来解析使用IN运算符的WHERE子句