OR运算符

时间:2016-05-24 15:42:28

标签: neo4j

我正在尝试在属性上创建索引后使用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的任何更好的方法来实现查询?

2 个答案:

答案 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