跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

使用 CALL 调用内联过程

在 GQL 中,为了实现更复杂的查询组合和结果处理,可以使用 CALL 语句将一组语句封装成一个语句块,然后对该语句块的结果进行进一步的操作,如排序、限制、聚合等。这种方式类似于在表达式中使用圆括号将子表达式括起来,以确保其结果可以被引用和处理。这种语句块被称为内联过程。本文描述如何使用CALL调用内联过程。

有关如何调用命名过程的信息,请参见使用 CALL 调用命名过程。

语法

call_inline_procedure_statement
OPTIONAL CALL { procedure_body }

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