Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/export/ Documentation version: v5.3.2 # EXPORT `EXPORT`语句用于将查询结果导出到表、文件、或悦数图数据库开发版的持久图中。 ## 使用场景 `EXPORT`语句可在[过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/)中的以下三种形式使用,具体取决于执行环境和创建的图: | 执行环境 | 创建的图 | 用法 | Graph 服务 | 图 | 支持`MATCH ... EXPORT ...`和`TABLE ... EXPORT ...` | Graph 服务 | 临时图 | 全部支持(`MATCH ... EXPORT ...`、`匹配计算... EXPORT ...`、`TABLE ... EXPORT ...`) - `MATCH ... EXPORT ...`:`EXPORT`语句跟在`MATCH`语句之后,作为查询的顶层语句之一,导出`MATCH`语句的查询结果。 - `TABLE ... EXPORT ...`:`EXPORT`语句跟在`TABLE`变量之后,作为查询的顶层语句之一,导出`TABLE`变量中存储的结果。 - `匹配计算 ... EXPORT ...`:`EXPORT`语句被包含在匹配计算语句的`PER NODE`或`PER PATH`块内部,导出匹配计算语句的查询结果。 关于图和临时图的区别,请参见[图与临时图](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/versus/)。 ## 语法 语法图源码 export_statement ```` export_statement ::= 'EXPORT' ( (value_expression ('AS' identifier)? ) ( ',' (value_expression ('AS' identifier)? ) )* ) 'INTO' variable ```` ## 参数 ### `value_expression` 计算结果为待导出的值或常量的值表达式。常用的值表达式包括[属性表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/property/)、[函数表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/function/)、[常量表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/constant/)和[变量表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/binding-variable/)。 ### `identifier` 待导出的字段的别名。该别名必须为标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/#_3)。 ### `variable` 接收导出数据的表变量或文件变量。该变量必须在使用 EXPORT 语句之前定义。更多信息,请参见[表变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/table-variable/)和[文件变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/file-variable/)。 表变量或文件变量中的字段数必须与 EXPORT 语句中指定的值表达式的数量相等。此外,字段的数据类型必须满足以下要求: - 若值表达式是代表点或边的变量表达式,则对应字段的数据类型必须为`STRING`。 - 否则,对应字段的数据类型必须与值表达式计算结果的数据类型兼容。 ## 示例 ### 图 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。 #### 导出函数执行结果至表格 ```` ''' USE movie { TABLE t TYPED TABLE { user_id INT, random_rate DOUBLE } MATCH (v@`User`) WHERE v.id IN [605, 606] EXPORT v.id, rand() INTO t FOR r IN t RETURN r.user_id AS user_id, r.random_rate AS random_rate } ''' ```` 以上示例匹配了 ID 为`605`和`606`的用户,并将其 ID 及随机评分值导出到由表变量`t`指定的表格中。 返回: ```` +---------+--------------------+ | user_id | random_rate | +---------+--------------------+ | 605 | 0.5253821211646783 | | 606 | 0.9054484414067815 | +---------+--------------------+ ```` #### 导出函数执行结果至文件 ```` ''' USE movie { FILE f { birth_year INT, count INT } = DATAFILE { PATH:"file:///tmp/test/birth_year_count", FORMAT:"CSV", INCLUDE_HEADER: true } MATCH (v@`Actor`) WHERE v.birthDate >= date("1990-01-01") AND v.birthDate < date("2000-01-01") RETURN year(v.birthDate) AS birth_year, count(*) AS count NEXT EXPORT birth_year, count INTO f } ''' ```` 以上示例匹配了出生日期在`1990-01-01`到`2000-01-01`之间的演员,并将演员的出生年份及出现次数导出到由文件变量`f`指定的文件中。 在文件变量`f`指定的路径`/tmp/test/birth_year_count`下,CSV 格式的文件已创建,具体如下: ```` $ cat /tmp/test/birth_year_count/xxx.csv "birth_year","count" 1993,2 1992,3 1990,4 1998,1 1997,2 1991,3 1994,3 ```` ### 临时图 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/),并假设已创建并填充临时图`#movie_temp`。有关创建临时图的更多信息,请参见 [CREATE TEMPORARY GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/)。 #### 导出数据至表格 ```` ''' USE #movie_temp { TABLE t TYPED TABLE { user_id INT, random_rate DOUBLE } MATCH (v@`User`) WHERE v.id IN [605, 606] EXPORT v.id, rand() INTO t FOR r IN t RETURN r.user_id AS user_id, r.random_rate AS random_rate } ''' ```` 关于示例的详细说明,请参见上文导出函数执行结果至表格。 #### 导出数据至文件 ```` ''' USE #movie_temp { FILE f { birth_year INT, count INT } = DATAFILE { PATH:"file:///tmp/test/birth_year_count", FORMAT:"CSV", INCLUDE_HEADER: true } MATCH (v@`Actor`) WHERE v.birthDate >= date("1990-01-01") AND v.birthDate < date("2000-01-01") RETURN year(v.birthDate) AS birth_year, count(*) AS count NEXT EXPORT birth_year, count INTO f } ''' ```` 关于示例的详细说明,请参见上文导出函数执行结果至文件。 #### 导出数据到图 ```` ''' -- 创建目标图以存储导出的数据 CREATE GRAPH IF NOT EXISTS movie_export_test TYPED movie_type ''' ''' -- 从临时图导出数据并插入到目标图 USE #movie_temp { TABLE t {id INT64, name STRING} MATCH (a@Actor) PER NODE (a) { EXPORT a.id, a.name INTO t } USE movie_export_test FOR r IN t INSERT (@Actor{id: r.id, name: r.name}) } ''' ```` 上述示例将临时图`#movie_temp`中所有`Actor`点的 ID 和名称导出到表变量`t`中。随后通过`USE`语句切换到本地图`movie_export_test`,并将这些数据作为`Actor`点插入。 #### 导出数据到远程悦数图数据库开发版 如果目标图位于不同的悦数图数据库开发版实例上,可以使用`nebula_exec`过程将导出数据分批发送到远程集群。有关`nebula_exec`的更多信息,请参见 [nebula_exec](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/nebula-exec/)。 ```` ''' USE #movie_temp { TABLE t {id INT64, name STRING} VALUE fmt_query = " TABLE t TYPED TABLE {id INT64, name STRING} = %s USE movie FOR r IN t MATCH (a@Actor) WHERE a.id = r.id SET a.name = r.name" MATCH (a@Actor) PER NODE (a) { EXPORT a.id, "Actor_" || CAST(a.id AS STRING) INTO t } FOR split IN table_split(t, CAST(256 AS UINT)) CALL nebula_exec("nebula://:@:", fmt(fmt_query, to_literal(split))) FINISH } ''' ```` 上述示例将临时图中所有`Actor`点的 ID 和生成名称导出到表变量`t`中。随后将数据按最多 256 行分批,并通过`nebula_exec`过程将每批数据发送到远程悦数图数据库开发版集群,以更新`movie`图中对应`Actor`点的`name`属性。