CALL 过程
CALL 子句用于调用部署在数据库中的存储过程。
CALL 子句也用于评估子查询。有关在此上下文中 CALL 子句的更多信息,请参阅 CALL 子查询。 |
有关如何列出存储过程的信息,请参阅 SHOW PROCEDURES。
| Neo4j 自带了许多内置存储过程。有关这些过程的列表,请参阅 操作手册 → 存储过程。用户也可以开发自定义存储过程并将其部署到数据库中。详情请参阅 Java 参考 → 用户自定义存储过程。 |
示例图
以下图表用于下方的示例
要重新创建它,请在空的 Neo4j 数据库中运行以下查询
CREATE (andy:Developer {name: 'Andy', born: 1991}),
(beatrice:Developer {name: 'Beatrice', born: 1985}),
(charlotte:Administrator {name: 'Charlotte', born: 1990}),
(david:Administrator {name: 'David', born: 1994, nationality: 'Swedish'}),
(andy)-[:KNOWS]->(beatrice),
(beatrice)-[:KNOWS]->(charlotte),
(andy)-[:KNOWS]->(david)
示例
CALL 无参数调用存储过程此示例调用了内置存储过程 db.labels(),它会列出数据库中使用的所有标签。
CALL db.labels()
| 标签 (label) |
|---|
|
|
行:2 |
调用存储过程时使用括号是最佳实践,尽管 Cypher® 允许在调用元数(arity)为 0(无参数)的过程时省略括号。仅当整个查询由单个 CALL 子句组成的所谓独立过程调用时,才允许省略括号。 |
CALL 无参数调用存储过程此示例调用了存储过程 dbms.checkConfigValue(),它使用字面量参数来检查配置设置值的有效性。
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
| "valid" | "message" |
|---|---|
|
|
行:1 |
|
CALL 使用参数调用存储过程此示例使用参数作为实参来调用 dbms.checkConfigValue() 存储过程。每个过程参数都被视为具有相同名称的相应语句参数的值(如果未提供此类参数,则为 null)。
{
"setting": "server.bolt.enabled",
"value": "true"
}
CALL dbms.checkConfigValue($setting, $value)
| "valid" | "message" |
|---|---|
|
|
行:1 |
|
| 使用参数实参的示例以 JSON 格式展示了给定参数;它们提交的确切方式取决于所使用的驱动程序。有关使用参数进行查询的更多信息,请参阅 参数。 |
CALL 同时使用字面量和参数调用存储过程此示例同时使用字面量和参数实参来调用 dbms.checkConfigValue() 存储过程。
{
"setting": "server.bolt.enabled"
}
CALL dbms.checkConfigValue($setting, 'true')
| "valid" | "message" |
|---|---|
|
|
行:1 |
|
使用 YIELD
YIELD 关键字用于指定要返回的过程元数据的列,从而实现对显示信息的选择和过滤。
YIELD *使用 YIELD * 将返回存储过程的所有可用返回列。
CALL db.labels() YIELD *
| 标签 (label) |
|---|
|
|
行:2 |
如果该过程包含已弃用的返回列,这些列也会被返回。
请注意,YIELD * 仅在独立的过程调用中有效。如果存在除单个 CALL 子句之外的其他子句,则必须在 YIELD 子句中显式命名变量。此限制简化了查询逻辑,并防止过程输出变量意外地与查询中的其他变量冲突。例如,以下写法是无效的:
CALL db.labels() YIELD *
RETURN count(*) AS results
YIELD 特定的过程结果并对其进行过滤YIELD 可用于过滤特定结果。这需要了解过程签名中参数的名称,这些名称可以在 操作手册 → 存储过程 中找到,也可以在 SHOW PROCEDURES 命令返回的 signature 列中找到(见下文示例)。
db.propertyKeys() 的参数名称SHOW PROCEDURES YIELD name, signature
WHERE name = 'db.propertyKeys'
RETURN signature
| 签名 |
|---|
|
行:1 |
之后可以使用这些参数名称进行进一步的查询过滤。请注意,如果过程调用是更大查询的一部分,则必须显式命名其输出。在下面的示例中,propertyKey 被重命名为 prop,然后在查询后续部分用于统计图中每个属性出现的次数。
YIELD 返回的特定参数CALL db.propertyKeys() YIELD propertyKey AS prop
MATCH (n)
WHERE n[prop] IS NOT NULL
RETURN prop, count(n) AS numNodes
| prop | numNodes |
|---|---|
|
|
|
|
|
|
行:3 |
|
关于 VOID 存储过程的说明
Neo4j 支持 VOID 存储过程的概念。VOID 过程是不声明任何结果字段且不返回任何结果记录的过程。VOID 过程仅产生副作用,不允许使用 YIELD。在较大查询的中间调用 VOID 过程将简单地传递每一条输入记录(即,就记录流而言,它的行为类似于 WITH *)。
可选的过程调用
OPTIONAL CALL 允许进行可选的过程调用。与 OPTIONAL MATCH 类似,由 OPTIONAL CALL 产生的任何空行都将返回 null。
CALL 和 OPTIONAL CALL 之间的区别此查询使用了 apoc.neighbors.tohop() 存储过程(Neo4j APOC Core 库的一部分),它返回在指定距离(本例中为 1 跳)和方向内由给定关系类型连接的所有节点。
CALLMATCH (n)
CALL apoc.neighbors.tohop(n, "KNOWS>", 1)
YIELD node
RETURN n.name AS name, collect(node.name) AS connections
请注意,结果不包括图中没有任何指向外部的 KNOWS 关系连接的节点。
| 名称 (name) | connections |
|---|---|
|
|
|
|
行:2 |
|
下面使用了相同的查询,但将 CALL 替换为 OPTIONAL CALL。
CALLMATCH (n)
OPTIONAL CALL apoc.neighbors.tohop(n, "KNOWS>", 1)
YIELD node
RETURN n.name AS name, collect(node.name) AS connections
现在结果中包含了那两个没有任何指向外部的 KNOWS 关系连接的节点。
| 名称 (name) | connections |
|---|---|
|
|
|
|
|
|
|
|
行:4 |
|