运行 Cypher 片段

在 APOC 中,Cypher 可以用作一种安全、具备图感知能力且经过部分编译的脚本语言。

过程概述

下表描述了所支持的过程

限定名称 类型

apoc.cypher.doIt
apoc.cypher.doIt(statement STRING, params MAP<STRING, ANY>) - 使用给定的参数运行动态构建的语句。此过程允许读取和写入语句。

过程

apoc.cypher.run
apoc.cypher.run(statement STRING, params MAP<STRING, ANY>) - 使用给定的参数运行动态构建的只读语句。

过程

apoc.cypher.runMany
apoc.cypher.runMany(statement STRING, params MAP<STRING, ANY>, config MAP<STRING, ANY>) - 运行每个分号分隔的语句,并返回语句结果的摘要。

过程

apoc.cypher.runFirstColumnMany
apoc.cypher.runFirstColumnMany(statement STRING, params MAP<STRING, ANY>) - 使用给定的参数运行给定的语句,并返回收集到 LIST<ANY> 中的第一列。

函数

apoc.cypher.runFirstColumnSingle
apoc.cypher.runFirstColumnSingle(statement STRING, params MAP<STRING, ANY>) - 使用给定的参数运行给定的语句,并返回第一列的第一个元素。

函数

示例:按标签快速统计节点数

使用 count 函数可以快速计算特定标签的节点数量,但前提是查询必须仅包含 count 函数。例如:

MATCH (:Person) RETURN count(*);

也可以使用 UNION ALL 子句组合多个针对特定标签的节点计算

有效
MATCH (:Person) RETURN count(*)
UNION ALL
MATCH (:Movie) RETURN count(*);

使用 WITH 子句则无法实现同样的效果

无效
MATCH (:Person)
WITH count(*) as people
MATCH (:Movie) RETURN people, count(*) as movies;

此查询将通过遍历所有节点来计算数量,这是一个非常缓慢的操作。

为了获得更快的处理速度(可在几毫秒内完成),可以使用 apoc.cypher.run 来构建 COUNT() 语句并分别运行每一条语句。

CALL db.labels() yield label
CALL apoc.cypher.run("match (:`"+label+"`) return count(*) as count", null) yield value
return label, value.count as count

类似的方法也可用于获取每个标签的属性键

CALL db.labels() yield label
CALL apoc.cypher.run("MATCH (n:`"+label+"`) RETURN keys(n) as keys LIMIT 1",null) yield value
RETURN label, value.keys as keys