Neo4j / Cypher - разбиение на страницы с несколькими запросами - PullRequest
0 голосов
/ 20 января 2019

Мне нужно разбить на страницы (ограничение + смещение ) результатов нескольких запросов с высокой производительностью.

Сначала я имитировал разбиение на страницы с помощью генератора питона

first = 100
# Offset
skip = 50

cursor = 0

# Generator is returned by neo4j so we don't have a significant performance impact
q1_results = tx.run(.....)
q2_results = tx.run(.....)

for result in q1_results:
   if cursor < first:
       yield result
       cursor += 1

for result in q2_results:
   if cursor < first:
       yield result
       cursor += 1

Однако проблема здесь заключается в принудительном выполнении смещения: чтобы достичь его программным путем, мне придется повторить итерации по первым результатам и сделать это следующим образом:

first = 100
# Offset
skip = 50

cursor = 0
skip_cursor = 0

# Generator is returned by neo4j so we don't have a significant performance impact
q1_results = tx.run(.....)
q2_results = tx.run(.....)

for result in q1_results:
    if cursor < first & skip_cursor > skip:
        yield result
        cursor += 1
    else:
        skip_cursor += 1

for result in q2_results:
    if cursor < first & skip_cursor > skip:
        yield result
        cursor += 1
    else:
        skip_cursor += 1      

Затем я попытался объединить запрос в один большой запрос, но для этого потребовались агрегирующие функции (например, collect и distinct), поэтому это оказало огромное влияние на производительность, и запросы стали очень медленными.

Мне интересно, что я что-то упустил и есть ли правильный способ добиться нумерации страниц в этом сценарии.

1 Ответ

0 голосов
/ 22 января 2019

На данный момент правильный способ сделать это - использовать SKIP и LIMIT в запросе Cypher. Базовый протокол не имеет механизма для возврата только части результатов вашего запроса, поэтому даже с вашим кодом вы все равно будете генерировать, отправлять и буферизовать весь набор результатов.

У нас есть пункт в нашей дорожной карте, чтобы ввести полный контроль потока, наряду с реактивным API. Это включит полную поддержку стека для инкрементальной доставки записей, с возможностью пропустить и отменить поток. Но это сложное изменение, поэтому оно наступит не раньше конца этого года. До этого лучше всего использовать ключевые слова Cypher.

...