

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

# 从 Blazegraph 迁移到 Amazon Neptune
<a name="migrating-from-blazegraph"></a>

如果您在开源 [Blazegraph](https://blazegraph.com/) RDF 三重存储中有图形，则可以通过以下步骤将图形数据迁移到 Amazon Neptune：
+ *预调配 AWS 基础设施。*首先，使用 AWS CloudFormation 模板预调配所需的 Neptune 基础设施（请参阅[创建 Neptune 集群](get-started-create-cluster.md)）。
+ *从 Blazegraph 导出数据。*从 Blazegraph 导出数据有两种主要方法，即使用 SPARQL CONSTRUCT 查询或使用 Blazegraph Export 实用程序。
+ *将数据导入 Neptune。*然后，您可以使用 [ Neptune Workbench](graph-notebooks.md) 和[Neptune 批量加载程序](bulk-load.md)将导出的数据文件加载到 Neptune 中。

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

## Blazegraph 与 Neptune 的兼容性
<a name="migrating-from-blazegraph-compatibility"></a>

在将图形数据迁移到 Neptune 之前，您应该注意 Blazegraph 和 Neptune 之间有几个显著的差异。这些差异可能需要更改查询和/或应用程序架构，甚至使迁移变得不切实际：
+ **`Full-text search`** – 在 Blazegraph 中，您可以通过与 Apache Solr 集成，使用内部全文搜索或外部全文搜索功能。如果您使用其中任何一项特征，请随时了解 Neptune 支持的全文搜索特征的最新更新。请参阅[Neptune 全文搜索](full-text-search.md)。
+ **`Query hints`** – Blazegraph 和 Neptune 都使用查询提示的概念扩展 SPARQL。在迁移过程中，您需要迁移所使用的任何查询提示。有关 Neptune 支持的最新查询提示的信息，请参阅[SPARQL 查询提示](sparql-query-hints.md)。
+ **推理** – Blazegraph 在三元组模式下支持推理作为可配置选项，但在四元组模式下不支持。Neptune 尚不支持推理。
+ **地理空间搜索** – Blazegraph 支持配置启用地理空间的命名空间。此特征在 Neptune 中尚不可用。
+ **多租赁** – Blazegraph 支持在单个数据库中使用多租赁。在 Neptune 中，通过将数据存储在命名图形中并使用 USING NAMED 子句进行 SPARQL 查询，或者为每个租户创建单独的数据库集群，来支持多租赁。
+ **联合身份验证** – Neptune 目前支持与 Neptune 实例可访问的位置进行 SPARQL 1.1 联合身份验证，例如私有 VPC 内、VPC 之间或外部互联网端点。根据特定的设置和所需的联合身份验证端点，您可能需要一些额外的网络配置。
+ **Blazegraph 标准扩展** – Blazegraph 包括对 SPARQL 和 REST API 标准的多个扩展，而 Neptune 仅与标准规范本身兼容。这可能需要更改您的应用程序，否则会使迁移变得困难。

## 为 Neptune 预调配 AWS 基础设施
<a name="migrating-from-blazegraph-provisioning"></a>

尽管您可以通过 AWS 管理控制台 或 AWS CLI 手动构建所需的 AWS 基础设施，但改用 CloudFormation 模板通常更方便，如下所述：

**使用 CloudFormation 模板预调配 Neptune：**

1. 导航到 [使用创建 Amazon Neptune 集群 AWS CloudFormation](get-started-cfn-create.md)。

1. 在您的首选区域中选择**启动堆栈**。

1. 设置所需的参数（堆栈名称和 `EC2SSHKeyPairName`）。还要设置以下可选参数以简化迁移过程：
   + 将 `AttachBulkloadIAMRoleToNeptuneCluster` 设置为 true。此参数允许创建相应的 IAM 角色并将其附加到您的集群，以允许批量加载数据。
   + 将 `NotebookInstanceType` 设置为您的首选实例类型。此参数创建一个 Neptune 工作簿，用于批量加载到 Neptune 中并验证迁移。

1. 选择**下一步**。

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

1. 选择**下一步**。

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

1. 选择**创建堆栈**。

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

## 从 Blazegraph 中导出数据
<a name="migrating-from-blazegraph-exporting"></a>

下一步是以[与 Neptune 批量加载程序兼容的格式](bulk-load-tutorial-format-rdf.md)从 Blazegraph 中导出数据。

根据数据在 Blazegraph 中的存储方式（三元组或四元组）以及正在使用的命名图形的数量，Blazegraph 可能需要您多次执行导出过程并生成多个数据文件：
+ 如果数据存储为三元组，则需要为每个命名的图形运行一次导出。
+ 如果数据存储为四元组，则可以选择以 N-Quads 格式导出数据，也可以选择以三元组格式导出每个命名图形。

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

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

如果您不需要 Blazegraph 在线，请使用 [BlazeGraph 导出实用程序](https://github.com/blazegraph/database/wiki/DataMigration#export)。为此，您必须下载 Blazegraph，并且需要可以访问数据文件和配置文件，但服务器不需要运行。

### 使用 SPARQL CONSTRUCT 从 Blazegraph 导出数据
<a name="migrating-from-blazegraph-sparql-construct"></a>

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\$1) 脚本将数据导出为 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 存储库](https://github.com/blazegraph/database/wiki/REST_API#rdf-data)上指定的值以适当的格式（N-Triples、RDF/XML 或 Turtle）导出数据。

### 使用 Blazegraph 导出实用程序导出数据
<a name="migrating-from-blazegraph-export-utility"></a>

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

您可以在安装了 Blazegraph 但未运行的计算机上通过 Java 命令行运行该实用程序。运行此命令的最简单方法是下载位于 GitHub 上的最新 [blazegraph.jar](https://github.com/blazegraph/database/releases/download/BLAZEGRAPH_2_1_6_RC/blazegraph.jar) 版本。运行此命令需要几个参数：
+ **`log4j.primary.configuration`** - log4j 属性文件的位置。
+ **`log4j.configuration`** - log4j 属性文件的位置。
+ **`output`** – 导出数据的输出目录。文件以 `tar.gz` 的形式位于命名的子目录中，如知识库中所述。
+ **`format`** – 所需的输出格式，后跟 `RWStore.properties` 文件的位置。如果您使用的是三元组，则需要将 `-format` 参数更改为 `N-Triples`、`Turtle` 或 `RDF/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) 桶，并将导出的数据复制到该桶
<a name="migrating-from-blazegraph-s3-bucket"></a>

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

有关如何创建 Amazon S3 桶的说明，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)中的[如何创建 S3 桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)，以及 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)中的[创建存储桶的示例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-get-location-example.html)。

有关如何将导出的数据文件复制到新的 Amazon S3 桶的说明，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)中的[将对象上传到桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html)，或[将高级 (s3) 命令与 AWS CLI 一起使用](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html)。也可以使用如下所示的 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')
```

## 使用 Neptune 批量加载程序将数据导入 Neptune
<a name="migrating-from-blazegraph-import-data"></a>

从 Blazegraph 导出数据并将其复制到 Amazon S3 桶后，就可以将数据导入 Neptune 了。Neptune 有一个批量加载程序，与使用 SPARQL 执行加载操作相比，它加载数据的速度更快，开销更少。批量加载程序进程通过调用加载程序端点 API 启动，将存储在已识别的 S3 桶中的数据加载到 Neptune 中。

尽管您可以通过直接调用加载程序 REST 端点来实现此目的，但您必须有权访问在其中运行目标 Neptune 实例的私有 VPC。您可以设置堡垒主机，通过 SSH 连接到该计算机，然后运行 cURL 命令，但是使用 [Neptune Workbench](graph-notebooks.md) 会更容易。

Neptune Workbench 是一款预配置的 Jupyter 笔记本，作为 Amazon SageMaker 笔记本运行，安装了若干 Neptune 专用的笔记本魔术命令。这些魔术命令简化了常见的 Neptune 操作，例如检查集群状态、运行 SPARQL 和 Gremlin 遍历以及运行批量加载操作。

要启动批量加载过程，请使用 `%load` 魔术命令，它提供了一个运行 [Neptune 加载程序命令](load-api-reference-load.md) 的接口：

1. 登录 AWS 管理控制台并通过以下网址打开 Amazon Neptune 控制台：[https://console.aws.amazon.com/neptune/home](https://console.aws.amazon.com/neptune/home)。

1. 选择 **aws-neptune-blazegraph-to-neptune**。

1. 选择**打开笔记本**。

1. 在 Jupyter 的运行实例中，要么选择现有笔记本，要么使用 Python 3 内核创建一个新笔记本。

1. 在笔记本中，打开一个单元格，输入 `%load` 并运行该单元格。

1. 为批量加载程序设置参数：

   1. 在**源**中，输入要导入的源文件的位置：`s3://{bucket_name}/{file_name}`。

   1. 对于**格式**，选择相应的格式，在本示例中为 `nquads`。

   1. 对于**加载 ARN**，输入 `IAMBulkLoad` 角色的 ARN（此信息位于 IAM 控制台的**角色**下）。

1. 选择**提交**。

结果包含请求的状态。批量加载通常是长时间运行的进程，因此响应并不意味着加载已完成，而只是表示加载已经开始。此状态信息会定期更新，直到它报告任务已完成。

**注意**  
这些信息也可以在博客文章[迁移到云端：将 Blazegraph 迁移到 Amazon Neptune](https://aws.amazon.com/blogs/database/moving-to-the-cloud-migrating-blazegraph-to-amazon-neptune/) 中找到。