apoc.cypher.doIt
语法 |
|
||
描述 |
使用给定参数运行动态构建的语句。此过程允许读取和写入语句。 |
||
输入参数 |
名称 |
类型 |
描述 |
|
|
要运行的 Cypher 语句。 |
|
|
|
给定 Cypher 语句的参数。 |
|
返回参数 |
名称 |
类型 |
描述 |
|
|
Cypher 语句返回的结果。 |
|
|
此过程无法执行模式操作。要在模式模式下运行查询,请使用 apoc.cypher.runSchema。 |
在 Cypher 中使用动态标签
无需使用 APOC,即可在 Cypher 中动态引用节点标签和关系类型。
动态创建、匹配和合并标签和类型的 Cypher 语法
CREATE (n1:$(label))-[r:$(type)]->(n2:$(label))
MERGE (n1:$(label))-[r:$(type)]->(n2:$(label))
MATCH (n1:$(label))-[r:$(type)]->(n2:$(label))
动态计算的类型必须解析为 STRING 或 LIST<STRING>。更多信息请参见 Cypher 手册 → CREATE、MERGE、MATCH。
使用示例
本节示例基于一个我们不小心创建了全大写节点标签的图,如下所示
CREATE (:PERSON)
CREATE (:EVENT)
CREATE (:TAG)
CREATE (:LOCATION);
我们希望将所有这些标签更新为只有首字母大写。我们可以使用 toLower 和 apoc.text.capitalize 函数来转换标签名称,如下面的查询所示
CALL db.labels()
YIELD label
RETURN apoc.text.capitalize(toLower(label)) AS value;
| 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;
| value |
|---|
{node: (:Person)} |
{node: (:Event)} |
{node: (:Tag)} |
{node: (:Location)} |
| 对于模式操作,需要使用 apoc.cypher.runSchema 过程。 |