Есть ли возможность ограничить результаты запроса на шифрование временным лимитом? - PullRequest
0 голосов
/ 22 января 2019

Я выполняю довольно трудоемкие шифровальные запросы в производстве.Запрос не обязательно должен иметь все совпадающие результаты, скорее, он должен быть завершен в указанный промежуток времени.Если существует 10000 возможных совпадений, то лучше использовать 5000, а не иметь тайм-аут транзакции neo4j, который мал.

Можно ли указать ограничение по времени в запросе шифра, как на шаге Gremlin timeLimit?

1 Ответ

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

Вы можете использовать процедуру APOC apoc.periodic.rock_n_roll_ while для реализации ограничения по времени.

Первым параметром процедуры должен быть запрос Cypher, который остановит процедуру, когда запрос вернет 0 или NULL или FALSE. Этот запрос имеет доступ к $previous параметру , который содержит предыдущее значение, возвращаемое запросом (или NULL, если запрос вызывается впервые). Возвращаемое значение запроса должно иметь имя loop.

Второй параметр должен быть запросом Cypher, который возвращает все элементы (например, узлы), над которыми нужно работать, а третий параметр должен быть запросом Cypher, который работает с каждым элементом, возвращаемым вторым параметром. Именованные значения, возвращаемые запросом Cypher второго параметра (например, с именем foo), доступны для запроса Cypher третьего параметра (например, $foo).

Четвертый параметр - это «размер партии» - количество элементов, над которыми должен работать третий параметр, прежде чем снова будет задан первый параметр, чтобы решить, стоит ли останавливаться.

В следующем примере запроса (для вымышленного варианта использования) я предполагаю, что $duration (приблизительное максимальное количество миллисекунд ожидания ответа) и $batchSize (размер каждой партии) передаются в качестве параметров (к внешнему запросу Cypher):

WITH timestamp() + $duration AS endTime
CALL apoc.periodic.rock_n_roll_while(
  'RETURN timestamp() < endTime AS loop',
  'MATCH (p:Person) RETURN p',
  'MATCH (p) WHERE p = $p SET p.lastname = p.name',
  $batchSize)

duration является приблизительным, так как мы проверяем, соблюден ли срок после каждой партии. Для более точного ограничения времени уменьшите batchSize.

Исходная версия вышеупомянутого запроса (без ограничения по времени) была бы примерно такой:

MATCH (p:Person)
SET p.lastname = p.name
...