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
不带参数的过程调用过程时最好使用括号,尽管 Cypher® 允许在调用 arity-0(无参数)过程时省略括号。省略括号仅在所谓的独立过程调用中可用,即整个查询由单个 CALL 子句组成时。 |
CALL
不带参数的过程此示例调用过程 dbms.checkConfigValue()
,该过程使用字面量参数检查配置设置值的有效性。
CALL dbms.checkConfigValue('server.bolt.enabled', 'true')
"有效" | "消息" |
---|---|
|
|
行数:1 |
CALL
过程这调用了示例过程 dbms.checkConfigValue()
,使用参数作为参数。每个过程参数都被视为具有相同名称的相应语句参数的值(如果未给出此类参数,则为 null)。
{
"setting": "server.bolt.enabled",
"value": "true"
}
CALL dbms.checkConfigValue($setting, $value)
"有效" | "消息" |
---|---|
|
|
行数:1 |
使用参数作为参数的示例以 JSON 格式显示给定参数;提交它们的具体方式取决于所使用的驱动程序。有关使用参数进行查询的更多信息,请参阅参数。 |
CALL
过程这调用了示例过程 dbms.checkConfigValue()
,同时使用字面量和参数作为参数。
{
"setting": "server.bolt.enabled"
}
CALL dbms.checkConfigValue($setting, 'true')
"有效" | "消息" |
---|---|
|
|
行数:1 |
使用 YIELD
YIELD
关键字用于指定要返回的过程元数据中的哪些列,从而允许选择和筛选显示的信息。
YIELD *
使用 YIELD *
将返回过程的所有可用返回列。
CALL db.labels() YIELD *
标签 |
---|
|
|
行数: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 跳)和方向内由给定关系类型连接的所有节点。
CALL
MATCH (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
。
CALL
MATCH (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 |