亚马逊AWS官方博客

使用全自动工具将 Neo4j 图形数据库迁移到 Amazon Neptune

Original URL: https://aws.amazon.com/blogs/database/migrating-a-neo4j-graph-database-to-amazon-neptune-with-a-fully-automated-utility/

 

Amazon Neptune 是一项完全托管的图形数据库服务,可帮助您轻松构建和运行使用高度互连数据集的应用程序。从现有自行管理图形数据库(例如Neo4j)迁移数据时,您可以从该服务的特定用途、高性能、快速、可扩展和可靠的图形数据库引擎中获益。

本文向您展示如何通过示例 AWS CDK 应用程序(利用 Neptune 工具 GitHub 存储库中的 neo4j-to-neptune 命令行实用工具),从 Neo4j 迁移到 Amazon Neptune。该示例应用程序完成以下任务:

  • 设置和配置 Neo4j 和 Amazon Neptune 数据库
  • 将 Neo4j 网站上的示例项目中的电影图形导出为 CSV 文件
  • 使用 neo4j-to-neptune 实用程序将导出的数据转换为 Amazon Neptune 中的批量加载 CSV 格式
  • 将转换后的数据导入 Amazon Neptune

架构

以下架构显示了构建用于迁移的松散耦合应用程序所需的构建块。应用程序可自动创建以下资源:

  • 一个用于下载和安装 Neo4j 图形数据库的 Amazon EC2 实例,以及一个用于查询 Amazon Neptune 的 Apache TinkerPop Gremlin 控制台。该实例既充当迁移源,又充当运行 AWS CLI 命令的客户端,例如将导出的文件复制到 Amazon S3 存储桶并将数据加载到 Amazon Neptune。
  • 将数据加载到 Neptune 的 Amazon S3 存储桶。
  • 具有一个图形数据库实例的 Amazon Neptune 数据库集群

运行迁移

使用Git 从 GitHub 存储库克隆 AWS CDK 应用程序。确保满足先决条件后,按照说明运行迁移。

应用程序可以自动将 Neo4j 电影图形数据库迁移到 Amazon Neptune。成功运行该应用程序后,会在终端中看到类似于以下屏幕截图的输出:

记录值,例如 NeptuneEndpoint,以便在后续步骤中使用。

应用程序配置 Neo4j 和 Amazon Neptune 数据库并执行迁移。以下各部分说明该应用程序如何预置和运行迁移,并展示如何在 EC2 实例上使用 Gremlin 控制台查询 Neptune 以验证迁移。

迁移概览

AWS CDK 应用程序可自动执行迁移的三个基本阶段:

  1. 预置 AWS 基础设施
  2. 为迁移做准备
  3. 执行迁移

预置 AWS 基础设

当您运行该应用程序时,它会在您的 AWS 账户中创建以下资源。

Amazon VPC 和子网

应用程序创建一个由 VPCID 指示的 Amazon VPC。您必须在 VPC 中创建 Neptune 集群,并且只能访问该 VPC 内的终端节点。为访问您的 Neptune 数据库,该应用程序使用在同一 VPC 中运行的 EC2 实例来加载数据和运行查询。您需要创建两个 /24 公共子网,两个可用区中各一个。

EC2 实例

由 EC2Instance 指示的单个 EC2 实例执行以下功能:

  • 下载并安装 Neo4j 社区版图形数据库(版本“4.0.0”),
  • 运行 AWS CLI 命令以将本地文件复制到 Amazon S3
  • 运行 AWS CLI 命令以将数据加载到Neptune
  • 运行 Apache TinkerPop Gremlin 命令,查询和验证是否已将数据迁移到 Neptune

S3 存储桶

应用程序会创建一个单独的 S3 存储桶,由 S3BucketName 指示,用于保存从 Neo4j 导出的数据。应用程序触发从存储桶批量加载数据到 Neptune。

Amazon S3 网关 VPC 终端节点

应用程序在 VPC 内的公共子网中创建一个 Neptune 数据库集群。为了确保 Neptune 可以访问和下载 Amazon S3 中的数据,该应用程序还为 Amazon S3 创建了网关类型 VPC 终端节点。有关更多信息,请参阅网关 VPC 终端节点

单节点 Neptune 集群

这是此迁移的目的地,即由 NeptuneEndpoint 指示的目标 Neptune 图形数据库。应用程序将导出的数据加载到该数据库中。您可以在 EC2 实例上使用 Gremlin 控制台查询数据。

所需的 AWS IAM 角色和策略

为了允许访问 AWS 资源,该应用程序会创建执行迁移所需的所有角色和策略。

为迁移做准备

在预置基础设施之后,该应用程序将自动执行下图中所示的步骤:

在 Neo4j 中创建电影图形

应用程序使用引导 Shell 脚本在 EC2 实例上安装和配置 Neo4j 社区版 4.0。然后,脚本将 Neo4j 电影图形加载到该数据库中。

将图形数据导出到 CSV 文件

应用程序使用以下 Neo4j Cypher 脚本将所有节点和关系导出到以逗号分隔的文件中:

CALL apoc.export.csv.all('neo4j-export.csv', {d:','});

以下代码显示了已保存导出文件的位置:

/var/lib/neo4j/import/neo4j-export.csv

作为自动 Neo4j 配置的一部分,应用程序会安装 APOC 库,这包含从Neo4j 导出数据的程序,并使用以下代码编辑 neo4j.conf 文件,以便其可以写入磁盘上的文件:

apoc.export.file.enabled=true

应用程序还在 neo4j.conf 文件中将 Neo4j 的 APOC API 列入白名单以便使用。请参见以下代码:

dbms.security.procedures.unrestricted=apoc.*

执行迁移

在此阶段,应用程序将数据迁移到 Neptune。这包括以下自动化步骤。

将 Neo4j 导出的数据转换为 Gremlin 加载数据格式

应用程序使用 neo4j-to-neptune 命令行实用工具,通过一个命令即可将导出的数据转换为 Gremlin 加载数据格式。请参见以下代码:

$ java -jar neo4j-to-neptune.jar convert-csv -i /var/lib/neo4j/import/neo4j-export.csv -d output --infer-types

neo4j-to-neptune 实用工具创建一个输出文件夹,并将结果复制到单独的文件中:顶点和边缘各一个。该实用工具有两个必需的参数:Neo4j 导出文件的路径 (/var/lib/neo4j/import/neo4j-export.csv) 和写入转换后的 CSV文件的目录名称 (output)。还有一些可选参数,可以让您指定节点和关系多值属性策略,并打开数据类型推断。例如, --infer-types 标志会告诉实用工具推断输出 CSV 中每列的最窄支持类型,作为指定每个属性数据类型的替代方法。有关更多信息,请参阅 Gremlin 加载数据格式

neo4j-to-neptune 实用工具解决了 Neo4j 和 Neptune 属性图数据模型中的差异。Neptune 的属性图与 Neo4j 的属性图非常相似,包括支持顶点上多个标签以及多值属性(集合,但非列表)。Neo4j 允许将包含重复值的简单类型同类列表作为属性存储在节点和边缘上。另一方面,Neptune 为顶点属性提供集合和单一基数,并为边缘属性提供单一基数。neo4j-to-neptune 实用工具提供了一些策略,用于将包含重复值的 Neo4j 节点列表属性迁移到 Neptune 顶点属性,并将 Neo4j 关系列表属性迁移到 Neptune 边缘属性。有关更多信息,请参阅 GitHub 存储库

将输出数据复制到 Amazon S3

导出将创建两个文件:edge.csv 和vertices.csv。这些文件位于输出文件夹中。应用程序将这些文件复制到专门为此目的创建的 S3 存储桶中。请参见以下代码:

$ aws s3 cp /output/ s3://<S3BucketName>/neo4j-data --recursive

将数据加载到 Neptune

自动迁移的最后一步使用 Neptune 批量加载 AWS CLI 命令,将边缘和顶点加载到 Neptune 中。请参见以下代码:

curl -X POST \
    -H 'Content-Type: application/json' \
    <NeptuneLoaderEndpoint> -d '
    { 
      "source": "s3://<S3BucketName>/neo4j-data", 
      "format": "csv",  
      "iamRoleArn": "arn:aws:iam::<AWSAccount>:role/<NeptuneTrustedS3Role>", 
      "region": "<AWSRegion>", 
      "failOnError": "FALSE"
    }'

有关更多信息,请参阅将数据加载到 Amazon Neptune

验证迁移

在完成自动步骤之后,可以验证迁移是否成功。

Amazon Neptune 与 Apache TinkerPop3 和 Gremlin 3.4.5 兼容。这意味着您可以连接到 Neptune 数据库实例,并使用 Gremlin 遍历语言来查询图形。

要验证迁移,请完成以下步骤:

  1. 通过两项状态检查后,连接到 EC2 实例。 有关更多信息,请参阅状态检查类型
  2. 使用NeptuneEndpoint 的值执行以下命令:
$ docker run -it -e NEPTUNE_HOST=<NeptuneEndpoint> sanjeets/neptune-gremlinc-345:latest
  1. 根据提示,执行以下命令,将所有查询发送到 Amazon Neptune。
:remote console
  1. 执行以下命令,查看已迁移的顶点数。
g.v() .count()

以下屏幕截图显示了命令g.v() .count()的输出。

例如,您现在可以运行一个简单的查询,为您提供汤姆·克鲁斯 (Tom Cruise) 出演过的所有电影。以下屏幕截图显示了预期输出。

清理

运行迁移后,使用以下代码清理应用程序创建的所有资源:

npm run destroy

小结

Neptune 是一项完全托管的图形数据库服务,使您可以轻松地专注于为客户构建出色的应用程序,而不必担心数据库管理任务,如硬件预置、软件修补、设置、配置或备份。本文演示了如何通过几个简单步骤将 Neo4j 数据迁移到 Neptune。

 

本篇作者

Sanjeet Sahay

Amazon Web Services 的高级合作伙伴架构师。