2016-05-24 7 views
6

OR演算子を使用して、symbol、primaryidentifier、secondaryidentifier、およびnameというプロパティにインデックスを作成した後、582479個の遺伝子に対してクエリを実行しようとしています。 は、このクエリ:パフォーマンスが非常に悪いですOR演算子のパフォーマンスが悪い

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; 

、作成したインデックスが使用されていないが、3253ミリ秒

で唯一のラベルscan-> 2912399本の総デシベルヒットは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 msで合計8個のヒットが使用されました。ずっといい。 UNIONを使用せずにクエリを実装する方法はありますか?

答えて

2

あなたが今できる多くの他、サイファーのプランナーは、UNIONが今最高のソリューション私見です

賢く取得する必要がありますありません。

+0

ありがとうございます。それは本当に残念です!そうでなければ、AND演算子は正しく動作します –

0

あなたは4部(各条件に1つ)にクエリを分割し、最後のステップでunwindedされています1つの配列にすべての結果を収集することができます:

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 
+0

ありがとうStefan。このソリューションでは、dbヒット数が8から3に減少します。実行時間は賢明に改善されません。 –

+0

'Gene'と4つのプロパティのインデックスがありますか? –

+0

はい、インデックスが作成されています。 –

1

のNeo4j 3.2とインデックスの使用を導入していますOR演算子。すばらしいです!

関連する問題