该CALL
子句用于调用数据库中procedure。
介绍
使用该子句来调用程序CALL
。
此 |
每个过程调用都需要指定所有必需的过程参数。这可以通过在过程名称后使用括号括起来的逗号分隔列表显式地完成,也可以通过使用可用的查询参数作为过程调用参数隐式地完成。后一种形式仅在所谓的独立过程调用中可用,此时整个查询由单个CALL
子句组成。
大多数过程都会返回具有一组固定结果字段的记录流,类似于运行 Cypher ®查询返回记录流的方式。YIELD
子句用于明确选择将哪些可用结果字段作为新绑定的变量从过程调用返回给用户或供其余查询进一步处理。因此,为了能够用于YIELD
显式列,需要提前知道输出参数的名称(和类型)。每个产生的结果字段都可以选择使用别名重命名(即)resultFieldName AS newName
。过程调用绑定的所有新变量都将添加到当前范围中已绑定的变量集中。如果过程调用试图重新绑定先前绑定的变量(即,过程调用不能隐藏当前范围中先前绑定的变量),则会出错。在独立过程调用中,YIELD *
可用于选择所有列。在这种情况下,不需要提前知道输出参数的名称。
有关如何确定CALL
过程的输入参数和过程的输出参数的更多信息YIELD
,请参阅查看过程的签名。
在较大的查询中,具有显式的过程调用返回的记录YIELD
可以使用WHERE
后跟谓词的子句进行进一步过滤(类似于WITH ... WHERE ...
)。
如果被调用过程声明了至少一个结果字段,YIELD
则通常不能省略。但是YIELD
在独立过程调用中始终可以省略。在这种情况下,所有结果字段都作为从过程调用到用户的新绑定变量产生。
Neo4j 支持过程的概念VOID
。VOID
过程是一种不声明任何结果字段且不返回结果记录的过程,并且已明确声明为VOID
。调用VOID
过程可能只会产生副作用,因此既不允许也不需要使用YIELD
。VOID
在较大的查询中间调用过程只会传递每个输入记录(即,它就像WITH *
记录流一样)。
Neo4j 附带许多内置程序。有关这些程序的列表,请参阅操作手册 → 程序。 用户还可以开发自定义过程并部署到数据库。有关详细信息,请参阅Java 参考 → 用户定义过程。 |
使用以下方式调用过程CALL
这将调用内置过程db.labels
,列出数据库中使用的所有标签。
CALL db.labels()
标签 |
---|
行:2 |
|
|
Cypher 允许在元数为 0(无参数)的程序中省略括号。
最佳做法是对程序使用括号。 |
CALL db.labels
标签 |
---|
行:2 |
|
|
查看过程的签名
该SHOW PROCEDURES
命令可以返回所有过程的name
、signature
和。description
的默认输出为SHOW PROCEDURES
、name
、description
和mode
。worksOnSystem
要获取签名,请确保使用该YIELD
子句。
以下查询返回特定过程的签名:
SHOW PROCEDURES YIELD name, signature
WHERE name = 'dbms.listConfig'
RETURN signature
签名 |
---|
行:1 |
|
使用带引号的命名空间和名称调用过程
这将调用内置过程db.labels
,列出数据库中使用的所有标签。
SHOW PROCEDURES YIELD name, signature
WHERE name = 'dbms.listConfig'
RETURN signature
这将使用文字参数调用示例过程dbms.checkConfigValue
。参数直接写在语句文本中。
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
调用带有参数的过程
这将使用参数作为实参来调用示例过程dbms.checkConfigValue
。每个过程实参都将被视为具有相同名称的相应语句参数的值(如果未提供此类参数,则为 null)。
使用参数参数的示例以 JSON 格式显示给定的参数;提交这些参数的具体方式取决于所使用的驱动程序。有关使用参数进行查询的更多信息,请参阅参数。 |
{
"setting": "server.bolt.enabled",
"value": "true"
}
CALL dbms.checkConfigValue($setting, $value)
Cypher 允许省略具有 n 个参数的程序的括号,Cypher 会隐式传递参数参数。
最佳实践是使用括号来表示过程。只有在所谓的独立过程调用中,即整个查询由单个 |
{
"setting": "server.bolt.enabled",
"value": "true"
}
CALL dbms.checkConfigValue
调用混合文字和参数参数的过程
dbms.checkConfigValue
这将使用文字和参数参数调用示例过程。
{
"setting": "server.bolt.enabled"
}
CALL dbms.checkConfigValue($setting, 'true')
使用文字和默认参数调用过程
这将使用文字参数调用示例过程dbms.checkConfigValue
。也就是说,直接在语句文本中写出的参数和由过程本身提供的尾随默认参数。
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
使用以下方式调用过程CALL YIELD *
这将调用内置程序db.labels
来计算数据库中使用的所有标签。
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
如果该过程已弃用返回列,则也会返回这些列。
使用以下方法在复杂查询中调用过程CALL YIELD
这将调用内置程序db.labels
来计算数据库中使用的所有标签。
CALL db.labels() YIELD label
RETURN count(label) AS numLabels
由于过程调用是更大查询的一部分,因此必须明确命名所有输出。
调用过程并过滤其结果
这将调用内置过程db.labels
来计算数据库中所有包含字符串“User”的正在使用的标签。
CALL db.labels() YIELD label
WHERE label CONTAINS 'User'
RETURN count(label) AS numLabels
由于过程调用是更大查询的一部分,因此必须明确命名所有输出。
调用复杂查询中的过程并重命名其输出
这将调用内置过程db.propertyKeys
来计算数据库中当前使用的每个属性键的节点数。
CALL db.propertyKeys() YIELD propertyKey AS prop
MATCH (n)
WHERE n[prop] IS NOT NULL
RETURN prop, count(n) AS numNodes
由于过程调用是更大查询的一部分,因此必须明确命名所有输出。