Call
Cypher®.Call 用于生成 Cypher CALL 子查询。要实现此功能,请在构造函数中传入有效的子查询实例化 Cypher.Call。
new Cypher.Call(subquery);
在下面的示例中,Cypher.Call 接收一个 Cypher.Match 子句。这会生成一个被 CALL 包裹的 MATCH 子句。
const dog = new Cypher.Node({ labels: ["Dog"] });
const person = new Cypher.Node({ labels: ["Person"] });
const dogName = new Cypher.NamedVariable("dogName");
const pattern = new Cypher.Pattern(person).related(new Cypher.Relationship({ type: "HAS_DOG" })).to(dog);
const subquery = new Cypher.Match(pattern).return([dog.property("name"), dogName]);
const callClause = new Cypher.Call(subquery).return(dogName);
const { cypher, params } = callClause.build();
CALL {
MATCH (this0:Person)-[this1:HAS_DOG]->(this2:Dog)
RETURN this2.name AS dogName
}
RETURN dogName
变量作用域
变量 可以通过将它们以数组形式作为构造函数的第二个参数传入,从而添加到 CALL 子查询的作用域中。这些变量随后即可在子查询中使用。
new Cypher.Call(subquery, [var1, var2]);
下面的代码在 CALL 内的 CREATE 语句中加入了两个变量。生成的 Cypher 会在子查询作用域中添加 movieNode(this0)和 actorNode(this1)。
const movieNode = new Cypher.Node();
const actorNode = new Cypher.Node();
const createSubquery = new Cypher.Create(new Cypher.Pattern(movieNode).related().to(actorNode));
const clause = new Cypher.Call(createSubquery, [
movieNode,
actorNode,
]);
CALL (this0, this1) {
CREATE (this0)-[this2]->(this1)
}
要从外部作用域导入所有变量,请将第二个参数设为字符串 "*"。
const movieNode = new Cypher.Node();
const actorNode = new Cypher.Node();
const createSubquery = new Cypher.Create(new Cypher.Pattern(movieNode).related().to(actorNode));
const clause = new Cypher.Call(createSubquery, "*");
CALL (*) {
CREATE (this0)-[this2]->(this1)
}
.inTransactions
.inTransactions 方法会在 CALL 子查询后追加 IN TRANSACTIONS 修饰符,使其在独立事务中执行。
new Call(subquery).inTransactions();
CALL {
// Subquery
} IN TRANSACTIONS
inTransactions 方法支持可选设置,用于定制事务行为,包括错误处理、每事务的行数以及并发度。设置以对象形式传入。
new Call(subquery).inTransactions({
ofRows: 10
});
支持的设置
| 设置 | 描述 | Cypher |
|---|---|---|
|
每个事务的行数 |
|
|
错误处理方式: |
|
|
最大并发事务数 |
|
|
对失败的事务进行重试。可以是 |
示例 1:按行数并发事务
const clause = new Cypher.Call(subquery).inTransactions({
ofRows: 10,
concurrentTransactions: 5
});
CALL {
// subquery
} IN 5 CONCURRENT TRANSACTIONS OF 10 ROWS
示例 2:带最大持续时间的重试
const clause = new Cypher.Call(subquery).inTransactions({
retry: 10
});
CALL {
// subquery
} TRANSACTIONS ON ERROR RETRY FOR 10 SECONDS
示例 3:带回退策略的重试
const clause = new Cypher.Call(subquery).inTransactions({
retry: true,
onError: "continue"
});
CALL {
// subquery
} TRANSACTIONS ON ERROR RETRY THEN CONTINUE
可选调用
.optional() 方法将 CALL 子查询转换为OPTIONAL CALL 子查询。
new Cypher.Call(subquery).optional();
或者,你也可以直接使用 OptionalCall 子句来创建 OPTIONAL CALL。
new Cypher.OptionalCall(deleteSubquery);
两者将产生相同的 Cypher。
OPTIONAL CALL {
// Subquery
}