Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/statement-block/ Documentation version: v5.3.2 # 语句块 在 GQL 中,语句块是一条或多条按顺序执行的语句组成的集合。 语句块支持将多个独立语句组成一个单元在当前工作图中执行,并使用关键字`NEXT`分隔多个可独立执行的语句。 本文从悦数图数据库开发版 GQL 的视角介绍语句块的通用语法,示例也主要基于持久图上的查询和 DML 操作。 ## 语法 语法图源码 statement_block ```` 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 的数据定义语句。更多信息,请参见[数据定义语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/)。 一个语句块最多可包含一条数据定义语句,且这条语句必须是语句块中的唯一一条语句。 ### `linear_data_modifying_statement` 修改数据的数据操作语句。更多信息,请参见[数据操作语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dml/)。 一个语句块最多可包含一条数据操作语句,且这条语句必须是语句块中的最后一条语句。 ### `composite_query_statement` 复合查询语句。更多信息,请参见[复合查询](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/composite-query/)。 ### `match_compute_statement` 在临时图上执行迭代计算的匹配计算语句。更多信息,请参见[匹配计算](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/)。 ### `control_flow_statement` 控制执行流程的控制流语句。更多信息,请参见[控制流](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/control-flow/)。 ### `variable_manipulation_statement` 操作变量的变量操作语句。更多信息,请参见[变量操作](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/)。 ### `import_statement` 导入数据到临时图的导入语句。更多信息,请参见 [IMPORT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/import/)。 ### `export_statement` 将查询结果导出到表格或文件的导出语句。更多信息,请参见 [EXPORT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/export/)。 ### `logging_statement` 过程执行时打印日志消息的日志语句。更多信息,请参见[日志](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/log/)。 ## 示例 以下示例基于持久图,适用于悦数图数据库开发版运行时。 ### 包含数据查询和操作的语句块 ```` ''' 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 | +------------------+---------------+ ````