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

过程概述

本文介绍 GQL 中的过程(Procedure)的定义、类型及使用方法。

过程定义

在 GQL 中,过程是对一段计算过程的描述,其执行会计算出执行结果,并可能造成数据对象的修改。使用过程的主要目的是封装复杂的逻辑,简化查询过程,提高通用计算的重用性,从而提高操作效率。

过程体

每个过程都有一个过程体,其描述了过程的处理逻辑。过程体的语法如下:

procedure_body
variable_definition statement_block

procedure_body ::=
    (variable_definition+)? statement_block+

如语法所示,过程体由零或多个的变量定义,和一条或多条按顺序执行的语句块组成。只有最后一个语句块的输出会作为过程体的结果返回。

关于过程体中的语句,注意以下规则:

  • 只有过程体中的最后一条语句可以用RETURN语句结尾。
  • 只有当其返回通过关键字NEXT被后续语句使用时,非最后一条语句中才可以出现RETURN语句。
  • 若要提前终止语句且不返回任何结果,可使用FINISH。

过程体中的参数解释如下:

variable_definition

在过程中使用的变量的定义。变量可以是以下类型之一:

当在过程体中使用时,点绑定聚合值变量和活动集变量只能对过程所调用的单个临时图进行操作。

更多信息,请参见变量。

statement_block

一个包含一条或多条按顺序执行的语句的语句块。语句可以是以下类型之一:

当在过程体中使用匹配计算语句时,该语句只能对过程所调用的单个临时图进行操作。

当在过程体中使用WHILE语句时,注意以下规则:

  • WHILE循环不得返回任何结果。也即,它不得包含任何RETURN语句。
  • 要将值传递出WHILE循环,可以更新变量并使用BREAK跳出循环。
  • 要生成最终结果,可以在WHILE循环之后添加RETURN语句

当在过程体中使用IF语句时,注意以下规则:

  • 如果IF块是过程体中的最后一条语句,其分支可以使用RETURN语句来生成结果。
  • 如果IF块不是过程体中的最后一条语句,其分支不得以RETURN语句结尾。此时,可以在分支内更新变量。

更多信息,请参见语句块。

过程类型

根据数据或数据结构是否被修改,过程可以分为:

  • 修改数据结构的过程:修改数据结构。例如,创建图、删除图、创建标签、删除标签等。
  • 修改数据的过程:修改数据。例如,插入数据、删除数据、更新数据等。
  • 检索过程:不修改数据,只返回结果。例如,查询数据、计算数据等。

在 GQL 中,过程根据定义和使用方法的不同,分为两种类型:命名过程和内联过程。

命名过程

命名过程是在 GQL Catalog 中定义了过程体,并可以通过过程名称引用的过程。它适用于通用的、可重用的查询。

悦数图数据库开发版提供了一组内置的命名过程,同时允许您定义自己的命名过程。

内置过程

要查看完整的内置过程列表,可运行SHOW PROCEDURES语句。更多信息,请参见 SHOW PROCEDURES。有关内置过程、与其对应的SHOW、KILL等命令及调用方式的更多信息,请参见内置命名过程。

用户定义过程

您可以用 GQL 创建用户定义过程(User-Defined Procedure,简称 UDP)。更多信息,请参见 CREATE PROCEDURE 学习如何创建 UDF。

内联过程

内联过程是在 GQL 查询中直接定义和使用过程体的过程,不需要像命名过程一样在 Catalog 中预定义。适合临时或特定的查询。

目前,内联过程的过程体中不能包含任何 DDL 或 DML 语句。

用法

子句CALL用于调用过程。

  • 命名过程:通过引用过程的名称调用过程。例如:

    '''
    CALL show_graphs() 
    RETURN *
    '''
    

    更多信息,请参见使用 CALL 调用命名过程。

  • 内联过程:在查询语句中直接定义和使用过程。例如:

    '''
    LET a = 1, b = 2 
    CALL { 
      LET c = 3  
      RETURN c + 1 AS d } 
    RETURN d
    '''
    

    更多信息,请参见使用 CALL 调用内联过程。