并行 Cypher 执行
本节介绍用于并行执行 Cypher 语句的过程和函数。
过程和函数概述
以下介绍了可用的过程和函数
| 限定名称 | 类型 | 版本 |
|---|---|---|
|
- 通过 |
|
|
|
- 通过 |
|
|
|
|
|
|
Apoc Extended |
|
|
apoc.cypher.parallel
给定此数据集
UNWIND range(0, 9999) as idx CREATE (:Person {name: toString(idx)})
我们可以使用此过程通过 (:Person) 节点执行并行语句
MATCH (p:Person) WITH collect(p) as people
CALL apoc.cypher.parallel('RETURN a.name + t as title', {a: people, t: ' - suffix'}, 'a')
YIELD value RETURN value.title as title
在上述查询中,我们将一个映射作为第二个参数,将前一个映射中的字符串作为第三个参数传入。键为 'a' 的值将作为并行循环的列表。请注意,无需将 a 和 t 作为查询参数(即 $a 和 $t)传递,因为在底层,该过程会在查询中预置 WITH $parameterName as parameterName。因此在本例中,即为 WITH $a as a, $t as t。
在此示例中,我们并行执行多个查询 WITH $a as a, $t as t RETURN a.name + t as title,其中 a 是 people 列表中包含的 (:Person) 节点之一。
该过程的结果是
| 标题 |
|---|
"0 - suffix" |
"1 - suffix" |
"2 - suffix" |
"3 - suffix" |
"4 - suffix" |
… |
… |
… |
… |
apoc.cypher.parallel2
此过程与 apoc.cypher.parallel2 类似,但在底层工作方式不同(见下文)。使用前一个数据集,我们可以执行
MATCH (p:Person) WITH collect(p) as people
CALL apoc.cypher.parallel('RETURN a.name + t as title', {a: people, t: $suffix}, 'a')
YIELD value RETURN value.title as title
该过程的结果是
| 标题 |
|---|
"0 - suffix" |
"1 - suffix" |
"2 - suffix" |
"3 - suffix" |
"4 - suffix" |
… |
… |
… |
… |
parallel 将要并行的集合(本例中为 people)放入 java.util.parallelStream() 中,然后执行多个如下查询:WITH $a as a, $t as t RETURN a.name + t as title。
在 parallel2 转换示例中,fragment 参数首先将集合 people 拆分为 total / partitions 大小的批次,其中分区数为 100 * JVM 可用处理器数量(如果 total / partitions < 1,则为 1)。然后,它为每个批次创建一个 java.util.concurrent.Future,其中每个 Future 执行如下查询:WITH $t AS t UNWIND $a AS a RETURN a.name + $t as title(其中 $a 是当前的 people 批次)。最后,它计算这些 futures 的结果。
通常情况下,建议使用 apoc.cypher.parallel2 过程而非 apoc.cypher.parallel。