

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

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

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

这种方法通常也适用于从其它 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 预调配 Amazon 基础设施
<a name="migrating-from-blazegraph-provisioning"></a>

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

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

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

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

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

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

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

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

1. 查看您的选项并选中两个复选框，以确认 Amazon 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\+) 脚本将数据导出为 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.amazonaws.cn/AmazonS3/latest/userguide/)中的[如何创建 S3 桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/create-bucket.html)，以及 [Amazon Simple Storage Service 用户指南](https://docs.amazonaws.cn/AmazonS3/latest/userguide/)中的[创建存储桶的示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/create-bucket-get-location-example.html)。

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