2016-05-24 13 views
6

Sto cercando di eseguire una query su 582479 geni utilizzando l'operatore OR, dopo aver creato l'indice sulle proprietà: simbolo, identificatore primario, identificatore secondario e nome. Questa la query:Cattiva prestazione con l'operatore 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; 

Il rendimento è molto povera, gli indici creati non sono utilizzati, ma solo l'etichetta scan-> 2912399 totali colpi db a 3253 ms

cambiato la query per utilizzare 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; 

indici sono stati utilizzati -> 8 successi db totali in 73 ms. Molto meglio. Qual è il modo migliore per implementare la query senza usare UNION?

risposta

2

Non c'è molto altro si può fare in questo momento, pianificatore di Cypher avrebbe dovuto ottenere più intelligente

L'Unione si imho la soluzione migliore in questo momento.

+0

Grazie Michael. È davvero un peccato, altrimenti l'operatore AND funziona correttamente –

0

Si può suddividere la query in 4 parti (una per ogni condizione) e raccogliere tutti i risultati in una matrice che viene unwinded nell'ultimo passaggio:

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

Grazie Stefan. Questa soluzione riduce il numero di colpi db da 8 a 3. Nessun miglioramento sensibile nel tempo di esecuzione. –

+0

Hai indici per 'Gene' e le quattro proprietà? –

+0

sì, gli indici sono stati creati. –

1

Neo4j 3.2 ha introdotto l'uso di indici con l'operatore OR. Grande!