

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

如果您在開放原始碼 [Blazegraph](https://blazegraph.com/) RDF 三元組存放區中具有圖形，則可以使用下列步驟，將圖形資料遷移到 Amazon Neptune：
+ *佈建 AWS 基礎設施。*首先使用 an AWS CloudFormation 範本佈建所需的 Neptune [建立 Neptune 叢集](get-started-create-cluster.md) 基礎設施 （請參閱 )。
+ *從 Blazegraph 匯出資料。*從 Blazegraph 匯出資料有兩種主要方法，即使用 SPARQL CONSTRUCT 查詢或使用 Blazegraph 匯出公用程式。
+ *將資料匯入至 Neptune。*然後，您可以使用 [Neptune 工作台](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 中，支援多重租用的方式為將資料儲存在具名圖形中，並針對 SPARQL 查詢使用 USING NAMED 子句，或為每個租用戶建立個別的資料庫叢集。
+ **聯合** – Neptune 目前支援 SPARQL 1.1 聯合至可供 Neptune 執行個體存取的位置，例如在私有 VPC 內、跨 VPC 或外部網際網路端點。根據特定設定和必要的聯合端點，您可能需要一些額外的網路組態。
+ **Blazegraph 標準延伸模組** — Blazegraph 包含 SPARQL 和 REST API 標準的多個延伸模組，而 Neptune 僅與標準規格本身相容。這可能需要變更您的應用程式，否則會使遷移變得困難。

## 佈建 Neptune 的 AWS 基礎設施
<a name="migrating-from-blazegraph-provisioning"></a>

雖然您可以透過 AWS 管理主控台 或 手動建構所需的 AWS 基礎設施 AWS CLI，但使用 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 查詢。這需要您安裝、設定和執行 Blazegraph 執行個體，具中具有可存取的 SPARQL 端點。

如果您不需要 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/](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/)中的[建立儲存貯體的範例](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)，或[搭配 AWS CLI 使用高階 (s3) 命令](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。與使用 SPARQL 執行負載作業相比，Neptune 具有可以更快地載入資料且負荷更少的大量載入器。大量載入器程序會透過呼叫載入器端點 API 來啟動，以將儲存在所識別 S3 儲存貯體的資料載入至 Neptune。

雖然您可以直接呼叫載入器 REST 端點來執行此操作，但您必須對目標 Neptune 執行個體執行所在的私有 VPC 具有存取權。您可以設定堡壘主機、透過 SSH 進入該機器，然後執行 cURL 命令，但使用 [Neptune 工作台](graph-notebooks.md)更容易。

Neptune 工作台是一個預先設定的 Jupyter 筆記本，以 Amazon SageMaker 筆記本形式執行，其中安裝了數個 Neptune 特定的筆記本魔法。這些魔法可簡化常見的 Neptune 操作，例如檢查叢集狀態、執行 SPARQL 和 Gremlin 周遊，以及執行大量載入操作。

若要啟動大量載入程序，請使用 `%load` 魔法，這會提供一個執行 [Neptune 載入器命令](load-api-reference-load.md) 的介面：

1. 登入 AWS 管理主控台，並在 [https://console.aws.amazon.com/neptune/home](https://console.aws.amazon.com/neptune/home)：// 開啟 Amazon Neptune 主控台。

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/) 中取得。