CALL 过程

CALL 子句用于调用部署在数据库中的过程。

CALL 子句也用于评估子查询。有关此上下文中CALL 子句的更多信息,请参阅CALL 子查询

有关如何列出过程的信息,请参阅SHOW PROCEDURES

Neo4j 带有一系列内置过程。有关这些过程的列表,请参阅操作手册 → 过程。用户还可以开发自定义过程并部署到数据库。有关详细信息,请参阅Java 参考 → 用户定义的过程

示例图

以下图用于下面的示例

call procedure

要重新创建它,请对空的 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)

示例

示例 1. 无参数调用CALL 过程

此示例调用内置过程db.labels(),该过程列出数据库中使用的所有标签。

查询
CALL db.labels()
表 1. 结果
标签

"开发者"

"管理员"

行数:2

最佳实践是在调用过程时使用括号,尽管 Cypher® 允许在调用 0 元过程(无参数)时省略括号。仅在所谓的独立过程调用中才能省略括号,此时整个查询由单个CALL 子句组成。
示例 2. 无参数调用CALL 过程

此示例调用过程dbms.checkConfigValue(),该过程使用文字参数检查配置设置值的有效性。

查询
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
表 2. 结果
"有效" "消息"

true

"需要重启"

示例 3. 使用参数调用CALL 过程

这使用参数作为参数来调用示例过程dbms.checkConfigValue()。每个过程参数都被视为具有相同名称的相应语句参数的值(如果未给出此类参数,则为 null)。

参数
{
  "setting": "server.bolt.enabled",
  "value": "true"
}
查询
CALL dbms.checkConfigValue($setting, $value)
表 3. 结果
"有效" "消息"

true

"需要重启"

使用参数参数的示例以 JSON 格式显示给定参数;提交它们的精确方式取决于使用的驱动程序。有关使用参数进行查询的更多信息,请参阅参数
示例 4. 使用文字参数和参数参数调用CALL 过程

这使用文字参数和参数参数来调用示例过程dbms.checkConfigValue()

参数
{
  "setting": "server.bolt.enabled"
}
查询
CALL dbms.checkConfigValue($setting, 'true')
表 4. 结果
"有效" "消息"

true

"需要重启"

使用YIELD

YIELD 关键字用于指定要返回的过程元数据列,允许选择和过滤显示的信息。

示例 5. YIELD *

使用YIELD * 将返回过程的所有可用返回列。

查询
CALL db.labels() YIELD *
表 5. 结果
标签

"管理员"

"开发者"

行数:2

如果过程具有已弃用的返回列,则也会返回这些列。

请注意,YIELD * 仅在独立过程调用中有效。例如,以下无效

不允许
CALL db.labels() YIELD *
RETURN count(*) AS results
示例 6. YIELD 特定的过程结果并对其进行过滤

YIELD 可用于筛选特定结果。这需要了解过程签名中参数的名称,这些名称可以在操作手册 → 过程中找到,或者由SHOW PROCEDURES 查询返回。

查找db.propertyKeys 的参数名称
SHOW PROCEDURES YIELD name, signature
WHERE name = 'db.propertyKeys'
RETURN signature
表 6. 结果
签名

"db.propertyKeys() :: (propertyKey :: STRING)"

行数: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
表 7. 结果
prop numNodes

"name"

4

"born"

4

"nationality"

1

行数:3

关于 VOID 过程的说明

Neo4j 支持VOID 过程的概念。VOID 过程是不声明任何结果字段且不返回任何结果记录的过程。VOID 过程仅产生副作用,不允许使用YIELD。在较大的查询中间调用VOID 过程只会传递每个输入记录(即,就记录流而言,它的行为类似于WITH *)。

可选过程调用

OPTIONAL CALL 允许可选的过程调用。类似于OPTIONAL MATCHOPTIONAL CALL 生成的任何空行都将返回null

示例 7. 使用CALLOPTIONAL CALL 的区别

此查询使用apoc.neighbors.tohop() 过程(Neo4j 的APOC 核心库的一部分),该过程返回在指定距离(在本例中为 1 跳)和方向内由给定关系类型连接的所有节点。

常规过程CALL
MATCH (n)
CALL apoc.neighbors.tohop(n, "KNOWS>", 1)
YIELD node
RETURN n.name AS name, collect(node.name) AS connections

请注意,结果不包括图中没有任何传出的KNOWS 关系连接到它们的节点。

表 8. 结果
名称 连接

"Andy"

["Beatrice", "David"]

"Beatrice"

["Charlotte"]

行数:2

下面使用相同的查询,但将CALL 替换为OPTIONAL CALL

可选过程CALL
MATCH (n)
OPTIONAL CALL apoc.neighbors.tohop(n, "KNOWS>", 1)
YIELD node
RETURN n.name AS name, collect(node.name) AS connections

结果现在包括两个没有任何传出的KNOWS 关系连接到它们的节点。

表 9. 结果
名称 连接

"Andy"

["Beatrice", "David"]

"Beatrice"

["Charlotte"]

"Charlotte"

[]

"David"

[]

行数:4