Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-inline-procedure/ Documentation version: v5.3.2 # 使用 CALL 调用内联过程 在 GQL 中,为了实现更复杂的查询组合和结果处理,可以使用 CALL 语句将一组语句封装成一个语句块,然后对该语句块的结果进行进一步的操作,如排序、限制、聚合等。这种方式类似于在表达式中使用圆括号将子表达式括起来,以确保其结果可以被引用和处理。这种语句块被称为[内联过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/)。本文描述如何使用`CALL`调用内联过程。 有关如何调用命名过程的信息,请参见[使用 CALL 调用命名过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-procedure/)。 ## 语法 语法图源码 call_inline_procedure_statement ```` call_inline_procedure_statement ::= 'OPTIONAL'? 'CALL' '{' procedure_body '}' ```` ## 参数 ### `OPTIONAL` 当使用关键字`OPTIONAL`时,即使内联过程没有找到匹配的结果,查询仍会返回`null`作为结果,并返回其他查询结果。否则,如果内联过程没有找到匹配的结果,查询将不返回结果。 ### `procedure_body` 过程的处理逻辑,可以由[原始值变量定义](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/value-variable/)和以下类型的语句组成: - [数据查询语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/) - [控制流语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/control-flow/) - [匹配计算语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/) - [变量操作语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/) - [日志语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/log/) ## 示例 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。 ### 使用内联过程进行计算 ```` ''' 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](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/)。 ```` ''' 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 ````