Оптимизировать запрос Cypher для нескольких уникальных меток - PullRequest
0 голосов
/ 17 апреля 2020

В Neo4j: быстрее ли выполнять запрос ко всем узлам (AllNodesScan) и затем фильтровать по их меткам с помощью предложения WHERE, или выполнять несколько запросов с NodeByLabelScan?


Для иллюстрации Я хочу, чтобы все узлы, помеченные одной из меток в label_list:

label_list = ['label_1', 'label_2', ...]

, которые были бы быстрее в приложении (это псевдокод) :

for label in label_list:
    run.query("MATCH (n:{label}) return n")

или

run.query("MATCH (n) WHERE (n:label_1 or n:label_2 or ...)")


РЕДАКТИРОВАТЬ:

На самом деле, я только что понял, что лучшим вариантом может быть запуск нескольких NodeByLabelScan в одном запрос, с чем-то похожим на это:

MATCH (a:label_1)
MATCH (b:label_2)
...
UNWIND [a, b ..] as foo
RETURN foo

Может ли кто-нибудь говорить с ним?

1 Ответ

1 голос
/ 17 апреля 2020

Да, было бы лучше запустить несколько NodeByLabelScan с в одном запросе.

Например:

OPTIONAL MATCH (a:label_1)
WITH COLLECT(a) AS list
OPTIONAL MATCH (b:label_2)
WITH list + COLLECT(b) AS list
OPTIONAL MATCH (c:label_3)
WITH list + COLLECT(c) AS list
UNWIND list AS n
RETURN DISTINCT n

Примечания к запросу:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...