apoc.cypher.doIt

详细信息

语法

apoc.cypher.doIt(statement, params) :: (value)

描述

执行给定参数的动态构建语句。此过程既支持读语句也支持写语句。

输入参数

名称

类型

描述

statement

STRING

要执行的 Cypher 语句。

params

MAP

给定 Cypher 语句的参数。

返回参数

名称

类型

描述

MAP

Cypher 语句返回的结果。

此过程无法执行 SCHEMA(模式)操作。如需在 SCHEMA 模式下运行查询,请使用 apoc.cypher.runSchema

在 Cypher 中使用动态标签

在 Cypher 中,无需使用 APOC 即可动态引用节点标签和关系类型。

用于动态创建、匹配和合并标签与类型的 Cypher 语法
CREATE (n1:$(label))-[r:$(type)]->(n2:$(label))
MERGE (n1:$(label))-[r:$(type)]->(n2:$(label))
MATCH (n1:$(label))-[r:$(type)]->(n2:$(label))

动态计算出的类型必须求值为 STRINGLIST<STRING>。更多信息,请参阅 Cypher 手册 → CREATEMERGEMATCH

使用示例

本节中的示例基于一个图,其中我们不小心创建了全大写的节点标签,如下所示

CREATE (:PERSON)
CREATE (:EVENT)
CREATE (:TAG)
CREATE (:LOCATION);

我们希望将所有这些标签更新为仅首字母大写。我们可以使用 toLowerapoc.text.capitalize 函数来转换标签名称,如下面的查询所示

CALL db.labels()
YIELD label
RETURN apoc.text.capitalize(toLower(label)) AS value;
结果

"Event"

"Person"

"Tag"

"Location"

现在我们想要设置新标签并移除旧标签。apoc.cypher.doIt 过程是动态设置和移除标签的一种方式,但也可以使用纯 Cypher 来实现。以下展示了等效的查询

apoc.cypher.doIt
MATCH (node)
WITH node, labels(node)[0] AS label
CALL apoc.cypher.doIt(
  "WITH $node AS node
   REMOVE node:" + label + "\n" +
  "SET node:" + apoc.text.capitalize(toLower(label)) + "\n" +
  "RETURN node",
  {node: node})
YIELD value
RETURN value;
SET 和 REMOVE 子句
MATCH (node)
WITH node, labels(node)[0] AS label
REMOVE node:$(label)
SET node:$(apoc.text.capitalize(toLower(label)))
RETURN node AS value;
结果

{node: (:Person)}

{node: (:Event)}

{node: (:Tag)}

{node: (:Location)}

对于模式(schema)操作,必须使用 apoc.cypher.runSchema 过程。