我正在尝试在属性上创建索引后使用OR运算符对582479个基因运行查询:symbol,primaryidentifier,secondaryidentifier和name。 这个查询:
PROFILE
MATCH(g:Gene) WHERE g.symbol="CG11566" OR
g.primaryidentifier="CG11566" OR
g.secondaryidentifier="CG11566" OR
g.name="CG11566"
RETURN g.id, g.primaryidentifier, g.secondaryidentifier, g.symbol, g.name
ORDER BY g.id;
性能非常差,创建的索引不使用,只有标签扫描 - > 2912399总数在3253毫秒内命中
将查询更改为使用UNION:
PROFILE
MATCH(g:Gene) WHERE g.symbol='CG11566' return g.id
UNION MATCH(g:Gene) WHERE g.primaryidentifier='CG11566' return g.id
UNION MATCH(g:Gene) WHERE g.secondaryidentifier='CG11566' return g.id
UNION MATCH(g:Gene) WHERE g.name='CG11566' return g.id;
已使用索引 - >在73毫秒内总共有8次点击率。好多了。 没有使用UNION的任何更好的方法来实现查询?
答案 0 :(得分:2)
现在没有其他事可做了,Cypher的策划人必须更聪明
UNION现在是最好的解决方案。
答案 1 :(得分:0)
您可以将查询拆分为4个部分(每个条件一个)并将所有结果收集到一个在最后一步中未展开的数组中:
MATCH (g1:Gene{symbol:'CG11566'})
WITH collect(g1) as c1
MATCH (g2:Gene{primaryidentifier:'CG11566'})
WITH c1 + collect(g2) as c2
MATCH (g3:Gene{secondaryidentifier:'CG11566'})
WITH c2 + collect(g3) as c3
MATCH (g4:Gene{name:'CG11566'})
WITH c3 + collect(g4) as c4
UNWIND c4 as gene
... do stuff with genes found by any of the 4 parts