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

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 value_expression AS identifier , INTO variable

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属性。