EXPORT¶
EXPORT语句用于将查询结果导出到表、文件、或悦数图数据库开发版的持久图中。
使用场景¶
EXPORT语句可在过程中的以下三种形式使用,具体取决于执行环境和创建的图:
| 执行环境 | 创建的图 | 用法 |
|---|---|---|
| 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块内部,导出匹配计算语句的查询结果。
关于图和临时图的区别,请参见图与临时图。
语法¶
- export_statement
export_statement ::=
'EXPORT' ( (value_expression ('AS' identifier)? ) ( ',' (value_expression ('AS' identifier)? ) )* ) 'INTO' variable
参数¶
value_expression¶
计算结果为待导出的值或常量的值表达式。常用的值表达式包括属性表达式、函数表达式、常量表达式和变量表达式。
identifier¶
待导出的字段的别名。该别名必须为标识符。更多信息,请参见标识符命名规则。
variable¶
接收导出数据的表变量或文件变量。该变量必须在使用 EXPORT 语句之前定义。更多信息,请参见表变量和文件变量。
表变量或文件变量中的字段数必须与 EXPORT 语句中指定的值表达式的数量相等。此外,字段的数据类型必须满足以下要求:
- 若值表达式是代表点或边的变量表达式,则对应字段的数据类型必须为
STRING。 - 否则,对应字段的数据类型必须与值表达式计算结果的数据类型兼容。
示例¶
图¶
以下示例基于示例数据集。
导出函数执行结果至表格¶
'''
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
临时图¶
以下示例基于示例数据集,并假设已创建并填充临时图#movie_temp。有关创建临时图的更多信息,请参见 CREATE TEMPORARY GRAPH。
导出数据至表格¶
'''
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。
'''
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://<username>:<password>@<graph_host>:<graph_port>", fmt(fmt_query, to_literal(split))) FINISH
}
'''
上述示例将临时图中所有Actor点的 ID 和生成名称导出到表变量t中。随后将数据按最多 256 行分批,并通过nebula_exec过程将每批数据发送到远程悦数图数据库开发版集群,以更新movie图中对应Actor点的name属性。