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

语句块

在 GQL 中,语句块是一条或多条按顺序执行的语句组成的集合。

语句块支持将多个独立语句组成一个单元在当前工作图中执行,并使用关键字NEXT分隔多个可独立执行的语句。

本文从悦数图数据库开发版 GQL 的视角介绍语句块的通用语法,示例也主要基于持久图上的查询和 DML 操作。

语法

statement_block
linear_catalog_modifying_statement linear_data_modifying_statement composite_query_statement NEXT match_compute_statement control_flow_statement variable_manipulation_statement import_statement export_statement logging_statement

statement_block ::=
   ( ( linear_catalog_modifying_statement | linear_data_modifying_statement | composite_query_statement ) ( 'NEXT' ( linear_catalog_modifying_statement | linear_data_modifying_statement | composite_query_statement ) )* 
   | match_compute_statement
   | control_flow_statement 
   | variable_manipulation_statement 
   | import_statement
   | export_statement 
   | logging_statement )

参数

linear_catalog_modifying_statement

修改 Catalog 的数据定义语句。更多信息,请参见数据定义语句。

一个语句块最多可包含一条数据定义语句,且这条语句必须是语句块中的唯一一条语句。

linear_data_modifying_statement

修改数据的数据操作语句。更多信息,请参见数据操作语句。

一个语句块最多可包含一条数据操作语句,且这条语句必须是语句块中的最后一条语句。

composite_query_statement

复合查询语句。更多信息,请参见复合查询。

match_compute_statement

在临时图上执行迭代计算的匹配计算语句。更多信息,请参见匹配计算。

control_flow_statement

控制执行流程的控制流语句。更多信息,请参见控制流。

variable_manipulation_statement

操作变量的变量操作语句。更多信息,请参见变量操作。

import_statement

导入数据到临时图的导入语句。更多信息,请参见 IMPORT。

export_statement

将查询结果导出到表格或文件的导出语句。更多信息,请参见 EXPORT。

logging_statement

过程执行时打印日志消息的日志语句。更多信息,请参见日志。

示例

以下示例基于持久图,适用于悦数图数据库开发版运行时。

包含数据查询和操作的语句块

'''
USE movie 
    MATCH (a@Actor{id:2}) 
    RETURN a 
NEXT 
USE movie 
    INSERT (a)-[r@Act{}]->(b@Movie{id:2})
'''

上述语句块包含两个语句:

  • 第一个语句是一个查询语句,用于查找 ID 为 2 的演员;
  • 第二个语句是一个修改数据的操作语句,用于创建一个 ID 为 2 的电影,并插入一条为 ID 为 2 的演员与电影之间的关系。
'''
USE movie 
    MATCH (a@Movie{id:2}) 
    RETURN a 
NEXT 
USE movie 
    DETACH DELETE a 
'''

上述语句块包含两个语句:

  • 第一个语句是一个查询语句,用于查找 ID 为 2 的电影;
  • 第二个语句是一个修改数据的操作语句,用于删除 ID 为 2 的电影及其关联的边。

包含多个查询语句的语句块

'''
USE movie 
    MATCH 
        (actor@Actor)-[:Act]-(movie@Movie), 
        (director@Director)-[:Direct]->(movie), 
        (audience@`User`)-[:Watch]->(movie) 
    RETURN DISTINCT audience, movie 
    LIMIT 10 
NEXT  
USE movie 
    LET valid=1, inValid=0 
    RETURN sum(valid) AS audienceCount, sum(inValid) AS inValidAudienceCount, movie GROUP BY movie 
NEXT 
USE movie 
    FILTER WHERE audienceCount>0 AND inValidAudienceCount=0 
    ORDER BY audienceCount DESC, movie.name ASC 
    RETURN movie.name AS movieName, audienceCount 
'''

上述语句块包含三个查询语句:

  • 第一个语句是一个复合查询语句,用于查找演员、导演和观众与电影之间的关系;并返回 10 条观众和电影的信息;
  • 第二个语句是一个复合查询语句,用于计算每部电影的观众数量和无效观众数量;
  • 第三个语句是一个复合查询语句,用于过滤出观众数量大于 0 且无效观众数量等于 0 的电影,并按观众数量降序、电影名称升序排序。

返回:

+------------------+---------------+
| movieName        | audienceCount |
+------------------+---------------+
| Saw III          | 7             |
| Bread and Tulips | 3             |
+------------------+---------------+