从 Blazegraph 迁移到 Amazon Neptune - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从 Blazegraph 迁移到 Amazon Neptune

如果您在开源 Blazegraph RDF 三重存储中有图形,则可以通过以下步骤将图形数据迁移到 Amazon Neptune:

  • 预调配 Amazon 基础设施。首先,使用 Amazon CloudFormation 模板预调配所需的 Neptune 基础设施(请参阅创建数据库集群)。

  • 从 Blazegraph 导出数据。从 Blazegraph 导出数据有两种主要方法,即使用 SPARQL CONSTRUCT 查询或使用 Blazegraph Export 实用程序。

这种方法通常也适用于从其它 RDF 三重存储数据库迁移。

Blazegraph 与 Neptune 的兼容性

在将图形数据迁移到 Neptune 之前,您应该注意 Blazegraph 和 Neptune 之间有几个显著的差异。这些差异可能需要更改查询和/或应用程序架构,甚至使迁移变得不切实际:

  • Full-text search – 在 Blazegraph 中,您可以通过与 Apache Solr 集成,使用内部全文搜索或外部全文搜索功能。如果您使用其中任何一项特征,请随时了解 Neptune 支持的全文搜索特征的最新更新。请参阅Neptune 全文搜索

  • Query hints – Blazegraph 和 Neptune 都使用查询提示的概念扩展 SPARQL。在迁移过程中,您需要迁移所使用的任何查询提示。有关 Neptune 支持的最新查询提示的信息,请参阅SPARQL 查询提示

  • 推理 – Blazegraph 在三元组模式下支持推理作为可配置选项,但在四元组模式下不支持。Neptune 尚不支持推理。

  • 地理空间搜索 – Blazegraph 支持配置启用地理空间的命名空间。此特征在 Neptune 中尚不可用。

  • 多租赁 – Blazegraph 支持在单个数据库中使用多租赁。在 Neptune 中,通过将数据存储在命名图形中并使用 USING NAMED 子句进行 SPARQL 查询,或者为每个租户创建单独的数据库集群,来支持多租赁。

  • 联合身份验证 – Neptune 目前支持与 Neptune 实例可访问的位置进行 SPARQL 1.1 联合身份验证,例如私有 VPC 内、VPC 之间或外部互联网端点。根据特定的设置和所需的联合身份验证端点,您可能需要一些额外的网络配置。

  • Blazegraph 标准扩展 – Blazegraph 包括对 SPARQL 和 REST API 标准的多个扩展,而 Neptune 仅与标准规范本身兼容。这可能需要更改您的应用程序,否则会使迁移变得困难。

为 Neptune 预调配 Amazon 基础设施

尽管您可以通过 Amazon Web Services Management Console 或 Amazon CLI 手动构建所需的 Amazon 基础设施,但改用 CloudFormation 模板通常更方便,如下所述:

使用 CloudFormation 模板预调配 Neptune:
  1. 导航到 使用 Amazon CloudFormation 堆栈创建 Neptune 数据库集群

  2. 在您的首选区域中选择启动堆栈

  3. 设置所需的参数(堆栈名称和 EC2SSHKeyPairName)。还要设置以下可选参数以简化迁移过程:

    • AttachBulkloadIAMRoleToNeptuneCluster 设置为 true。此参数允许创建相应的 IAM 角色并将其附加到您的集群,以允许批量加载数据。

    • NotebookInstanceType 设置为您的首选实例类型。此参数创建一个 Neptune 工作簿,用于批量加载到 Neptune 中并验证迁移。

  4. 选择 Next(下一步)。

  5. 设置您想要的任何其它堆栈选项。

  6. 选择 Next(下一步)。

  7. 查看您的选项并选中两个复选框,以确认 Amazon CloudFormation 可能需要其它功能。

  8. 选择创建堆栈

堆栈创建过程可能耗时数分钟。

从 Blazegraph 中导出数据

下一步是以与 Neptune 批量加载程序兼容的格式从 Blazegraph 中导出数据。

根据数据在 Blazegraph 中的存储方式(三元组或四元组)以及正在使用的命名图形的数量,Blazegraph 可能需要您多次执行导出过程并生成多个数据文件:

  • 如果数据存储为三元组,则需要为每个命名的图形运行一次导出。

  • 如果数据存储为四元组,则可以选择以 N-Quads 格式导出数据,也可以选择以三元组格式导出每个命名图形。

下面我们假设您将单个命名空间导出为 N-Quads,但您可以重复该过程以获取其它命名空间或所需的导出格式。

如果您需要 Blazegraph 在迁移期间保持在线状态并可用,请使用 SPARQL CONSTRUCT 查询。这要求您安装、配置和运行带有可访问的 SPARQL 端点的 Blazegraph 实例。

如果您不需要 Blazegraph 在线,请使用 BlazeGraph 导出实用程序。为此,您必须下载 Blazegraph,并且需要可以访问数据文件和配置文件,但服务器不需要运行。

使用 SPARQL CONSTRUCT 从 Blazegraph 导出数据

SPARQL CONSTRUCT 是 SPARQL 的一项特征,它返回与指定查询模板匹配的 RDF 图形。在此用例中,您可以使用如下查询逐个命名空间导出数据:

CONSTRUCT WHERE { hint:Query hint:analytic "true" . hint:Query hint:constructDistinctSPO "false" . ?s ?p ?o }

尽管还有其它 RDF 工具可以导出这些数据,但运行此查询的最简单方法是使用 Blazegraph 提供的 REST API 端点。以下脚本演示了如何使用 Python (3.6+) 脚本将数据导出为 N-Quads:

import requests # Configure the URL here: e.g. http://localhost:9999/sparql url = "http://localhost:9999/sparql" payload = {'query': 'CONSTRUCT WHERE { hint:Query hint:analytic "true" . hint:Query hint:constructDistinctSPO "false" . ?s ?p ?o }'} # Set the export format to be n-quads headers = { 'Accept': 'text/x-nquads' } # Run the http request response = requests.request("POST", url, headers=headers, data = payload, files = []) #open the file in write mode, write the results, and close the file handler f = open("export.nq", "w") f.write(response.text) f.close()

如果数据存储为三元组,则需要更改 Accept 标头参数,以便使用在 Blazegraph GitHub 存储库上指定的值以适当的格式(N-Triples、RDF/XML 或 Turtle)导出数据。

使用 Blazegraph 导出实用程序导出数据

Blazegraph 包含一个用于导出数据的实用程序方法,即 ExportKB 类。ExportKB 便于从 Blazegraph 导出数据,但与之前的方法不同,它要求服务器在导出运行时处于离线状态。当您可以在迁移期间使 Blazegraph 离线时,或者迁移可以通过数据备份进行时,这成为理想的方法。

您可以在安装了 Blazegraph 但未运行的计算机上通过 Java 命令行运行该实用程序。运行此命令的最简单方法是下载位于 GitHub 上的最新 blazegraph.jar 版本。运行此命令需要几个参数:

  • log4j.primary.configuration - log4j 属性文件的位置。

  • log4j.configuration - log4j 属性文件的位置。

  • output – 导出数据的输出目录。文件以 tar.gz 的形式位于命名的子目录中,如知识库中所述。

  • format – 所需的输出格式,后跟 RWStore.properties 文件的位置。如果您使用的是三元组,则需要将 -format 参数更改为 N-TriplesTurtleRDF/XML

例如,如果您有 Blazegraph 日志文件和属性文件,请使用以下代码将数据导出为 N-Quads:

java -cp blazegraph.jar \ com.bigdata.rdf.sail.ExportKB \ -outdir ~/temp/ \ -format N-Quads \ ./RWStore.properties

如果导出成功,您将看到如下输出:

Exporting kb as N-Quads on /home/ec2-user/temp/kb Effective output directory: /home/ec2-user/temp/kb Writing /home/ec2-user/temp/kb/kb.properties Writing /home/ec2-user/temp/kb/data.nq.gz Done

创建 Amazon Simple Storage Service (Amazon S3) 桶,并将导出的数据复制到该桶

从 Blazegraph 导出数据后,在与目标 Neptune 数据库集群相同的区域中创建一个 Amazon Simple Storage Service (Amazon S3) 桶,供 Neptune 批量加载程序用于从中导入数据。

有关如何创建 Amazon S3 桶的说明,请参阅 Amazon Simple Storage Service 用户指南中的如何创建 S3 桶,以及 Amazon Simple Storage Service 用户指南中的创建存储桶的示例

有关如何将导出的数据文件复制到新的 Amazon S3 桶的说明,请参阅 Amazon Simple Storage Service 用户指南中的将对象上传到桶,或将高级 (s3) 命令与 Amazon CLI 一起使用。也可以使用如下所示的 Python 代码逐个复制文件:

import boto3 region = 'region name' bucket_name = 'bucket name' s3 = boto3.resource('s3') s3.meta.client.upload_file('export.nq', bucket_name, 'export.nq')