Вы можете использовать процедуру 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