使用 CALL 调用内联过程¶
在 GQL 中,为了实现更复杂的查询组合和结果处理,可以使用 CALL 语句将一组语句封装成一个语句块,然后对该语句块的结果进行进一步的操作,如排序、限制、聚合等。这种方式类似于在表达式中使用圆括号将子表达式括起来,以确保其结果可以被引用和处理。这种语句块被称为内联过程。本文描述如何使用CALL调用内联过程。
有关如何调用命名过程的信息,请参见使用 CALL 调用命名过程。
语法¶
- call_inline_procedure_statement
call_inline_procedure_statement ::=
'OPTIONAL'? 'CALL' '{' procedure_body '}'
参数¶
OPTIONAL¶
当使用关键字OPTIONAL时,即使内联过程没有找到匹配的结果,查询仍会返回null作为结果,并返回其他查询结果。否则,如果内联过程没有找到匹配的结果,查询将不返回结果。
procedure_body¶
过程的处理逻辑,可以由原始值变量定义和以下类型的语句组成:
示例¶
以下示例基于示例数据集。
使用内联过程进行计算¶
'''
LET x = 10
LET y = 20
CALL {
LET z = 30
RETURN x + y AS sum_xy, z * 2 AS double_z }
RETURN *
'''
返回:
+----------+--------+----+----+
| double_z | sum_xy | x | y |
+----------+--------+----+----+
| 60 | 30 | 10 | 20 |
+----------+--------+----+----+
使用内联过程进行查询¶
'''
USE movie
CALL {
MATCH (v@Director) RETURN v
UNION
MATCH (v@`User`) RETURN v }
LIMIT 3
RETURN v.name AS name, v.id AS id
ORDER BY id
'''
返回:
+----------------------+------+
| name | id |
+----------------------+------+
| Krzysztof Kieślowski | 1126 |
| William Shatner | 1748 |
| Roberto Rossellini | 4410 |
+----------------------+------+
使用 OPTIONAL CALL 进行查询¶
'''
USE movie
LET a = 1
LET b = 2
OPTIONAL CALL {
MATCH (v:Movie{id:1})
RETURN v.id AS id }
RETURN *
'''
返回:
+---+---+----+
| a | b | id |
+---+---+----+
| 1 | 2 | 1 |
+---+---+----+
使用内联过程实现控制流¶
'''
VALUE a = 2
CALL {
WHILE a > 0 THEN {
SET a = a - 1
LOG_INFO(a)
}
RETURN a AS b
}
RETURN b
'''
返回:
+---+
| b |
+---+
| 0 |
+---+
Log:
2026-01-13T02:02:07.693285 INFO - 1
2026-01-13T02:02:07.693597 INFO - 0
在内联过程中执行匹配计算¶
以下示例假设临时图#movie_temporary_graph已经创建并填充了示例数据集movie中的数据。有关如何创建临时图的详细信息,请参见 CREATE TEMPORARY GRAPH。
'''
USE #movie_temporary_graph
CALL {
MATCH (a) WHERE a.id IN [1,2,3]
PER NODE (a) {
LOG_INFO(a.name)
}
}
'''
返回:
Log:
2026-03-23T09:40:51.202952 INFO - Cowboy Bebop
2026-03-23T09:40:51.202952 INFO - Shadows in Paradise
2026-03-23T09:40:51.202992 INFO - George Lucas
2026-03-23T09:40:51.203017 INFO - Mark Hamill
2026-03-23T09:40:51.203017 INFO - Harrison Ford
嵌套使用内联过程¶
'''
VALUE a = 1
CALL {
VALUE b = a + 1
CALL {
WHILE b > 0 THEN {
SET b = b - 1
LOG_INFO(b)
}
RETURN b AS c
}
RETURN c AS d
}
RETURN d
'''
返回:
+---+
| d |
+---+
| 0 |
+---+
Log:
2026-01-13T02:01:00.221667 INFO - 1
2026-01-13T02:01:00.222015 INFO - 0