apoc.periodic.repeat

此过程不适用于集群环境,可能会产生不可预知的行为。它会持续在启动它的同一数据库上执行,这意味着在集群环境中,它仅在主节点(leader)上执行。如果发生主节点切换,该过程可能会报错并停止运行。

详细信息

语法

apoc.periodic.repeat(name, statement, rate [, config ]) :: (name, delay, rate, done, cancelled)

描述

运行一个重复调用的后台作业。要停止此过程,请使用 apoc.periodic.cancel

输入参数

名称

类型

描述

名称 (name)

STRING

任务名称。

statement

STRING

要执行的 Cypher 语句。

rate

INTEGER(整数)

每次作业执行之间的等待延迟(以秒为单位)。

config

MAP

{ params = {} :: MAP, cancelOnError = true :: BOOLEAN } 默认值为:{}引入于 APOC 2025.08 Cypher 25

返回参数

名称

类型

描述

名称 (name)

STRING

任务名称。

delay

INTEGER(整数)

任务的延迟时间。

rate

INTEGER(整数)

任务的速率。

done

布尔值 (BOOLEAN)

任务是否已完成。

cancelled

布尔值 (BOOLEAN)

任务是否已取消。

使用示例

我们可以通过运行以下查询,每秒创建 10 个 Person 节点

CALL apoc.periodic.repeat(
  "create-people",
  "UNWIND range(1,10) AS id CREATE (:Person {uuid: apoc.create.uuid()})",
   1
);
结果
名称 (name) delay rate done cancelled

"create-people"

0

1

FALSE

FALSE

我们可以通过运行以下查询来检查已创建了多少节点

MATCH (:Person)
RETURN count(*) AS count;
结果
count

110

如果您想取消此作业,可以使用 apoc.periodic.cancel 过程,并将作业名称作为参数指定。

错误处理

默认情况下,如果通过 apoc.periodic.repeat 运行的查询返回错误,任务将被取消且不再运行。此行为可以通过配置参数 cancelOnError 进行覆盖。

以下查询将创建一个带有随机 id 属性的 Person 节点。然而,当表达式 toInteger(3 * rand()) 的计算结果为 0 时,会抛出除以零的错误。通过将 cancelOnError 设置为 false,此错误将被忽略,任务将在持续一秒后重试。

CALL apoc.periodic.repeat(
  "sometimes-create-people",
  "CREATE (:Person {id: 1 / toInteger(3 * rand())})",
   1,
  { cancelOnError: false }
);
结果
名称 (name) delay rate done cancelled

"sometimes-create-people"

0

1

FALSE

FALSE