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

基于 GQL 模板导入

悦数数据迁移支持通过自定义 GQL 模板将数据导入悦数图数据库开发版。与导入数据中的标准导入方式不同,用户可直接编写 GQL 语句模板,由系统逐行读取数据源、填充模板中的占位符后发送至悦数图数据库开发版执行。

与标准导入方式的区别

标准导入 基于 GQL 模板导入
任务类型(taskType) import gqlTemplate
写入模式 从七种预设模式中选择(INSERT、INSERT IGNORE、INSERT REPLACE、INSERT UPDATE、UPDATE、DELETE、DETACH DELETE) 用户自行编写任意 GQL 语句
点边映射 通过nodetypes / edgetypes配置点边映射 不使用nodetypes / edgetypes,通过 GQL 模板直接定义写入逻辑。

前提条件

  • 已部署悦数数据迁移。
  • 目标悦数图数据库开发版实例已启动且可访问。
  • 目标图及其图类型已创建,或通过nebula.preHooks配置在导入前自动创建。
  • 数据源文件已准备就绪。

快速开始

以下是一个完整的自定义 GQL 模板导入配置示例,从本地 CSV 文件读取人员数据并插入点。

  1. 准备源文件和配置文件。

    CSV 文件/tmp/person.csv:

    id,name,age
    1,Alice,30
    2,Bob,25
    3,Charlie,35
    

    配置文件:

    将<current-password>替换为登录账号的当前密码。若已修改密码,请使用修改后的密码。

    {
      # 任务类型:指定为 gqlTemplate
      taskType: gqlTemplate
    
      # 目标悦数图数据库开发版实例的连接信息
      nebula: {
        graphAddr: "127.0.0.1:9669"
        graphName: "demo_graph"
        user: "root"
        passwd: "<current-password>"
        preHooks:[
            """
            CREATE GRAPH TYPE IF NOT EXISTS demo_graph_type AS {
                NODE Person (LABEL Person {id INT PRIMARY KEY, name STRING, age INT}),
                EDGE Follow (Person)-[LABEL Follow {degree INT, MULTIEDGE KEY()}]->(Person)
            }
            """,
            "CREATE GRAPH IF NOT EXISTS movie TYPED movie_type"
            ]
      }
    
      # 错误处理:执行失败的记录写入此目录
      error: {
        path: "/tmp/errors"
        maxRecords: 100
      }
    
      # 断点续传配置:
      checkPoint: {
        path: "/tmp/checkpoint"
        resume: true
      }
    
      # 数据源全局配置:所有模板共享的默认数据源参数
      sourcesCommon: {
        type: "local"
        format: "csv"
        header: true
        separator: ","
      }
    
      # GQL 模板列表:每个元素定义一个模板任务
      gqlTemplates: [
        {
          name: "insert_person"
          template: "USE demo_graph INSERT (@Person{id: $${id}, name: '$${name}', age: $${age}})"
          source: {
            path: "file:///tmp/person.csv"
          }
        }
      ]
    }
    

    系统逐行读取 CSV 文件,将$${字段名}占位符替换为实际值后执行。例如第一行数据生成如下 GQL 语句:

    USE demo_graph INSERT (@Person{id: 1, name: "Alice", age: 30})
    
  2. 执行导入命令。

    java -jar cli-5.3.0.jar -f <path_of_config_file> -n 5 -p 2
    

    关于命令详情,请参见使用悦数数据迁移导入数据。

配置说明

gqlTemplate 的配置文件结构如下:

{
    taskType: gqlTemplate

    nebula: {}

    error: {}

    checkPoint: {}

    sourcesCommon: {}

    gqlTemplates: []
}

其中nebula、error、checkPoint、sourcesCommon的配置项与标准导入方式相同,详情参见数据导入配置中的对应章节:

  • nebula:参见悦数图数据库开发版配置。
  • error:参见错误配置。
  • checkPoint:参见 Checkpoint 文件配置。
  • sourcesCommon:参见通用源配置。

Note

gqlTemplate模式不使用writeCommon和sources配置段。

GQL 模板配置(gqlTemplates)

gqlTemplates是一个数组,每个元素定义一个 GQL 模板任务。

参数 类型 是否必填 说明
name String 是 模板名称,用于标识任务和错误日志目录。
template String 是 GQL 语句模板。使用$${字段名}作为占位符引用数据源中的字段值。
source Object 否 该模板的数据源配置,可覆盖sourcesCommon中的同名字段。不同数据源类型支持的字段及格式,请参见各个数据源类型的数据源配置。

占位符使用说明

  • 占位符格式为$${字段名}(双美元符号),而非${字段名}。
  • 模板填充后的语句直接发送至悦数图数据库开发版执行,因此模板中可以使用任何悦数图数据库开发版支持的 GQL 语句。

sourcesCommon与gqlTemplates[].source的优先级

数据源通过sourcesCommon和各模板的gqlTemplates[].source两种方式进行配置。sourcesCommon定义全局默认值,各模板的gqlTemplates[].source可覆盖同名字段。字段解析优先级为:gqlTemplates[].source > sourcesCommon > 系统默认值。

示例

以下示例基于如下图类型和图。如果目标实例中尚未创建,可通过nebula.preHooks在导入前自动执行创建语句。

"""
-- 图类型
CREATE GRAPH TYPE IF NOT EXISTS demo_graph_type AS {
    NODE Person (LABEL Person {id INT PRIMARY KEY, name STRING, age INT}),
    EDGE Follow (Person)-[LABEL Follow {degree INT, MULTIEDGE KEY()}]->(Person)
}
"""

"""
-- 图
CREATE GRAPH IF NOT EXISTS demo_graph TYPED demo_graph_type
"""

导入点数据

以下示例从 CSV 文件读取人员数据,通过 GQL 模板插入点。

CSV 文件/tmp/person.csv:

id,name,age
1,Alice,30
2,Bob,25
3,Charlie,35

配置文件:

{
  taskType: gqlTemplate

  nebula: {
    graphAddr: "127.0.0.1:9669"
    graphName: "demo_graph"
    user: "root"
    passwd: "<current-password>"
  }

  sourcesCommon: {
    type: "local"
    format: "csv"
    header: true
    separator: ","
  }

  gqlTemplates: [
    {
      name: "insert_person"
      template: "USE demo_graph INSERT (@Person{id: $${id}, name: '$${name}', age: $${age}})"
      source: {
        path: "file:///tmp/person.csv"
      }
    }
  ]
}

导入边数据

以下示例从 CSV 文件读取关系数据,通过 GQL 模板插入边。

CSV 文件/tmp/follow.csv:

src,dst,degree
1,2,90
2,3,80
3,1,85

配置文件:

{
  taskType: gqlTemplate

  nebula: {
    graphAddr: "127.0.0.1:9669"
    graphName: "demo_graph"
    user: "root"
    passwd: "<current-password>"
  }

  sourcesCommon: {
    type: "local"
    format: "csv"
    header: true
    separator: ","
  }

  gqlTemplates: [
    {
      name: "insert_follow"
      template: "USE demo_graph MATCH (s@Person), (t@Person) WHERE s.id = $${src} AND t.id = $${dst} INSERT (s)-[@Follow{degree: $${degree}}]->(t)"
      source: {
        path: "file:///tmp/follow.csv"
      }
    }
  ]
}

多模板组合导入

以下示例在同一个配置文件中定义多个模板,同时导入点和边数据。

{
  taskType: gqlTemplate

  nebula: {
    graphAddr: "127.0.0.1:9669"
    graphName: "demo_graph"
    user: "root"
    passwd: "<current-password>"
  }

  sourcesCommon: {
    type: "local"
    format: "csv"
    header: true
    separator: ","
  }

  gqlTemplates: [
    {
      name: "insert_person"
      template: "USE demo_graph INSERT (@Person{id: $${id}, name: '$${name}', age: $${age}})"
      source: {
        path: "file:///tmp/person.csv"
      }
    },
    {
      name: "insert_follow"
      template: "USE demo_graph MATCH (s@Person), (t@Person) WHERE s.id = $${src} AND t.id = $${dst} INSERT (s)-[@Follow{degree: $${degree}}]->(t)"
      source: {
        path: "file:///tmp/follow.csv"
      }
    }
  ]
}