考虑以下问题:
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更优雅地编写第二个查询?
我想我也很困惑为什么IN
和OR
在这种情况下没有被翻译成索引查找,而等于运算符是。
答案 0 :(得分:1)
不幸的是,目前缺少实施。 :(
您可以在类型(2)
的多个查询之间使用类似于上一种方法的内容,或者更好的UNIONMATCH (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子句