2016-05-24 28 views
6

Próbuję uruchomić kwerendę nad genami 582479 przy użyciu operatora OR, po utworzeniu indeksu na właściwościach: symbol, identyfikator główny, identyfikator drugorzędny i nazwa. Ta kwerenda:Zła wydajność z operatorem 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; 

Spektakl jest bardzo słaba, indeksy tworzone są nie używane, ale tylko etykieta SKANUJ> 2912399 Wszystkich db trafienia w 3253 ms

Zmieniono zapytanie używać 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; 

indeksy zostały użyte -> 8 łącznej db trafień w 73 ms. Dużo lepiej. Lepszy sposób realizacji zapytania bez użycia UNION?

Odpowiedz

2

Nie ma wiele jeszcze można zrobić już teraz, planowanie Cypher musiałaby dostać mądrzejszy

Unia ma imho najlepszym rozwiązaniem w tej chwili.

+0

Dzięki Michael. To naprawdę wstyd, w przeciwnym razie operator AND działa poprawnie –

0

Mógłbyś podzielić zapytanie na 4 części (po jednym dla każdego warunku) i zebrać wszystkie wyniki na jednej tablicy, która jest ich rozwinąć, w ostatnim kroku:

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

Dzięki Stefan. To rozwiązanie zmniejsza liczbę trafień db od 8 do 3. Brak rozsądnej poprawy w czasie wykonywania. –

+0

Czy masz indeksy dla "Gene" i czterech właściwości? –

+0

Tak, utworzono indeksy. –

1

neo4j 3.2 wprowadziła użycie indeksów z operator OR. Wspaniały!

Powiązane problemy