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 会在子查询作用域中添加 movieNodethis0)和 actorNodethis1)。

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

ofRows

每个事务的行数

IN TRANSACTIONS OF [n] ROWS

onError

错误处理方式:continuebreakfail

ON ERROR [CONTINUE | BREAK | FAIL]

concurrentTransactions

最大并发事务数

IN [n] CONCURRENT TRANSACTIONS

retry

对失败的事务进行重试。可以是 true,也可以是一个数字(秒为单位的持续时间)。

ON ERROR RETRY [FOR x SECONDS]

示例 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
}
© . This site is unofficial and not affiliated with Neo4j, Inc.