

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

# 資料從 Neo4j 遷移到 Neptune
<a name="migration-data-migration"></a>

從 Neo4j 遷移到 Amazon Neptune 時，遷移資料是過程中的主要步驟。有多種方法遷移資料。正確的方法取決於應用程式的需求、資料大小和所需的遷移類型。不過，其中許多遷移都需要評估相同的考量，其中幾個會在下面反白顯示。

**注意**  
請參閱 [AWS 資料庫部落格](https://aws.amazon.com/blogs/?awsf.blog-master-category=category%23database)中的[使用全自動化公用程式將 Neo4j 圖形資料庫遷移至 Neptune](https://aws.amazon.com/blogs/database/migrating-a-neo4j-graph-database-to-amazon-neptune-with-a-fully-automated-utility/)，以取得如何執行離線資料遷移之範例的完整逐步解說。

## 評估從 Neo4j 到 Neptune 的資料遷移
<a name="migration-data-assessment"></a>

評估任何資料遷移時的第一步是確定如何遷移資料。這些選項取決於要遷移之應用程式的架構、資料大小，以及遷移期間的可用性需求。通常，遷移往往分為兩種類別之一：線上或離線。

離線遷移往往是最簡容易完成的，因為應用程式在遷移期間不接受讀取或寫入流量。在應用程式停止接受流量之後，可以匯出、最佳化、匯入資料，並在重新啟用應用程式之前測試應用程式。

線上遷移較為複雜，因為在遷移資料時，應用程式仍然需要接受讀取和寫入流量。每個線上遷移的確切需求可能會有所不同，但一般架構通常會與下列架構類似：
+ 資料庫的持續變更摘要需要在 Neo4j 中啟用，方法是設定 [Neo4j 串流作為 Kafka 叢集的來源](https://neo4j.com/labs/kafka/4.0/producer/)。
+ 一旦完成此操作，就可以遵循 [遷移到 Neptune 時從 Neo4j 匯出資料](#migration-data-exporting) 中的指示，以及稍後與 Kafka 主題相互關聯時提到的時間取得執行中系統的匯出。
+ 然後，匯出的資料會遵循 [遷移到 Neptune 時從 Neo4j 匯入資料](#migration-data-importing) 中的指示匯入至 Neptune。
+ 來自 Kafka 串流的變更資料接著可以複製到 Neptune 叢集，方法是使用與[從 Amazon Kinesis Data Streams 寫入至 Amazon Neptune](https://github.com/aws-samples/amazon-neptune-samples/tree/master/gremlin/stream-2-neptune) 中所述架構類似的架構。請注意，變更複寫可以並行執行，以驗證新的應用程式架構和效能。
+ 在驗證資料遷移之後，應用程式流量可被重新導向至 Neptune 叢集，且 Neo4j 執行個體可被解除委任。

## 從 Neo4j 遷移到 Neptune 的資料模型最佳化
<a name="migration-data-model-optimization"></a>

Neptune 和 Neo4j 都支援標示的屬性圖 (LPG)。不過，Neptune 有一些架構和資料模型差異，您可以利用這些差異來最佳化效能：

### 最佳化節點和邊緣 ID
<a name="migration-data-node-edge-id-optimization"></a>

Neo4j 會自動產生數值長 ID。使用 Cypher，您可以按 ID 引用節點，但通常不鼓勵這樣做，而是傾向於透過編製索引的屬性查閱節點。

Neptune 可讓您[為頂點和邊緣提供您自己的字串型 ID](access-graph-gremlin-differences.md#feature-gremlin-differences-user-supplied-ids)。如果您未提供自己的 ID，Neptune 會自動為新邊緣和頂點產生 UUID 的字串表示法。

如果您透過從 Neo4j 匯出資料，然後將其大量匯入至 Neptune，以將資料從 Neo4j 遷移至 Neptune，則您可以保留 Neo4j 的 ID。由 Neo4j 產生的數值可在匯入至 Neptune 時作為使用者提供的 ID，其中它們是以字串表示，而不是數值。

不過，在某些情況下，您可能想要提升頂點屬性以成為頂點 ID。就像使用編製索引的屬性查閱節點是在 Neo4j 中尋找節點的最快方法一樣，按 ID 查閱頂點是在 Neptune 中尋找頂點的最快方法。因此，如果您可以識別包含唯一值的適當頂點屬性，則應考慮在大量載入 CSV 檔案中以指定的屬性值取代頂點 \~id。如果這樣做，您還必須在 CSV 文件中重寫任何對應的 \~from 和 \~to 邊緣值。

### 將資料從 Neo4j 遷移到 Neptune 時的結構描述限制條件
<a name="migration-data-schema-constraints"></a>

在 Neptune 內，唯一可用的結構描述限制條件是節點或邊緣 ID 的唯一性。鼓勵需要利用唯一性限制條件的應用程式來查看此方法，透過指定節點或邊緣 ID 來實現唯一性限制條件。如果應用程式使用了多個資料行做為唯一性限制條件，則 ID 可能會設定為這些值的組合。例如，`id=123, code='SEA'` 可以表示為 `ID='123_SEA'`) 來實現複雜的唯一性限制條件。

### 將資料從 Neo4j 遷移到 Neptune 時的邊緣方向最佳化
<a name="migration-data-edge-direction"></a>

當節點、邊緣或屬性新增至 Neptune 時，它們會自動以[三種不同的方式編製索引](feature-overview-storage-indexing.md)，搭配[選用的第四個索引](features-lab-mode.md#features-lab-mode-features-osgp-index)。由於 Neptune 建置和[使用索引](feature-overview-storage-indexing.md)的方式，因此遵循傳出邊緣的查詢比使用傳入邊緣的查詢更有效率。根據 Neptune 的[圖形資料儲存模型](feature-overview-data-model.md)，這些是使用 SPOG 索引的主題型搜尋。

如果在將資料模型和查詢遷移至 Neptune 時，您發現最重要的查詢依賴於周遊高度散發的傳入邊緣，您可能想要考慮更改模型，以便這些周遊遵循傳出邊緣，尤其是在您無法指定要周遊的邊緣時。若要這麼做，請反轉相關邊緣的方向，並更新邊緣標籤以反映此方向變更的語義。例如，您可能會變更：

```
person_A — parent_of — person_B
   to:
person_B — child_of — person_A
```

若要在[大量載入邊緣 CSV 檔案](bulk-load-tutorial-format.md)中進行此變更，只要交換 `~from` 和 `~to` 資料行標頭，然後更新 `~label` 資料行的值即可。

作為反轉邊緣方向的替代方法，您可以啟用[第四個 Neptune 索引，即 OSGP 索引](feature-overview-storage-indexing.md#feature-overview-storage-indexing-osgp)，這使得周遊傳入邊緣或物件型搜索更有效。但是，啟用此第四個索引將降低插入率，並且需要更多的儲存體。

### 將資料從 Neo4j 遷移到 Neptune 時篩選最佳化
<a name="migration-data-filtering"></a>

Neptune 會進行最佳化，以在將屬性篩選為最具選擇性的可用屬性時發揮最佳效果。使用多個篩選器時，會為每個篩選器找到相符的項目集，然後計算所有相符集的重疊部分。如果可能，將多個屬性合併為單一屬性，這可將索引查詢的次數降至最低，並減少查詢的延遲。

例如，此查詢會使用兩個索引查詢和一個聯結：

```
MATCH (n) WHERE n.first_name='John' AND n.last_name='Doe' RETURN n
```

這個查詢會使用單一索引查詢擷取相同的資訊：

```
MATCH (n) WHERE n.name='John Doe' RETURN n
```

### 
<a name="migration-data-types"></a>

Neptune 支援與 Neo4j [不同的資料類型](bulk-load-tutorial-format-opencypher.md#bulk-load-tutorial-format-opencypher-data-types)。

**Neo4j 的資料類型對應到 Neptune 支援的資料類型**
+ **邏輯**：`Boolean`

  在 Neptune 中將此項對應到 `Bool` 或 `Boolean`。
+ **數值**：`Number`

  在 Neptune 中將此項對應到以下 Neptune openCypher 類型中最窄的一個，此類型可以支援有問題的數值屬性的所有值：

  ```
    Byte
    Short
    Integer
    Long
    Float
    Double
  ```
+ **文字**：`String`

  在 Neptune 中將此項對應到 `String`。
+ **時間點**：

  ```
    Date
    Time
    LocalTime
    DateTime
    LocalDateTime
  ```

  使用 Neptune 支援的下列其中一種 ISO-8601 格式，在 Neptune 中將這些項目 `Date` 對應為 UTC：

  ```
    yyyy-MM-dd
    yyyy-MM-ddTHH:mm
    yyyy-MM-ddTHH:mm:ss
    yyyy-MM-ddTHH:mm:ssZ
  ```
+ **持續時間**：`Duration`

  如有必要，請在 Neptune 中將此項對應到日期算術的數值。
+ **空間**：`Point`

  在 Neptune 中將此項對應到元件數值，每個數值接著都會變成個別的屬性，或者表示為要由用戶端應用程式解譯的字串值。請注意，Neptune 使用 OpenSearch 進行[全文檢索搜尋](full-text-search.md)整合時，可讓您編製地理位置屬性的索引。

### 將多值屬性從 Neo4j 遷移到 Neptune
<a name="migration-data-cardinality"></a>

Neo4j 允許[簡單類型的異質清單](https://neo4j.com/docs/cypher-manual/current/values-and-types/)同時儲存為節點和邊緣的屬性。這些清單可以包含重複值。

不過，在屬性資料圖中，Neptune 對於頂點屬性只允許[集合或單一基數](access-graph-gremlin-differences.md#feature-gremlin-differences-vertex-property-cardinality)，而對於邊緣屬性，則只允許單一基數。因此，無法將包含重複值的 Neo4j 節點清單屬性直接遷移到 Neptune 頂點屬性，也無法將 Neo4j 關係清單屬性直接遷移到 Neptune 邊緣屬性。

將具有重複值的 Neo4j 多值節點屬性遷移到 Neptune 的一些可能策略如下：
+ 捨棄重複值並將多值 Neo4j 節點屬性轉換為集合基數 Neptune 頂點屬性。請注意，Neptune 集合可能不會接著反映原始 Neo4j 多值屬性中項目的順序。
+ 將多值 Neo4j 節點屬性轉換為 Neptune 頂點字串屬性中 JSON 格式清單的字串表示法。
+ 將每個多值屬性值擷取至具有值屬性的個別頂點，然後使用以屬性名稱標記的邊緣將這些頂點連線到父頂點。

同樣地，將 Neo4j 多值關係屬性遷移到 Neptune 的可能策略如下：
+ 將多值 Neo4j 關係屬性轉換為 JSON 格式清單的字串表示法，並將其儲存為 Neptune 邊緣字串屬性。
+ 將 Neo4j 關係重構為附加到中間頂點的傳入和傳出 Neptune 邊緣。將每個多值關係屬性值擷取至具有值屬性的個別頂點，然後使用以屬性名稱標記的邊緣將這些頂點連線到此中繼頂點。

請注意，JSON 格式清單的字串表示法對 OpenCypher 查詢語言來說是不透明的，雖然 OpenCypher 包含允許在字串值內進行簡單搜尋的 `CONTAINS` 述詞。

## 遷移到 Neptune 時從 Neo4j 匯出資料
<a name="migration-data-exporting"></a>

從 Neo4j 匯出資料時，使用 APOC 程序匯出到 [CSV](https://neo4j.com/labs/apoc/4.1/export/csv/) 或 [GraphML](https://neo4j.com/labs/apoc/4.1/export/graphml/)。雖然可以匯出到其他格式，但有[開放原始碼工具](https://github.com/awslabs/amazon-neptune-tools/tree/master/neo4j-to-neptune)可將從 Neo4j 匯出的 CSV 資料轉換為 Neptune 大量載入格式，並且也有[開放原始碼工具](https://github.com/awslabs/amazon-neptune-tools/tree/master/graphml2csv)可將從 Neo4j 匯出的 GraphML 資料轉換為 Neptune 大量載入格式。

您也可以使用各種 APOC 程序將資料直接匯出到 Amazon S3。匯出至 Amazon S3 儲存貯體預設為停用，但可以使用 Neo4j APOC 文件中[匯出至 Amazon S3](https://neo4j.com/labs/apoc/4.3/export/csv/#export-csv-s3-export) 中反白的程序來啟用此儲存貯體。

## 遷移到 Neptune 時從 Neo4j 匯入資料
<a name="migration-data-importing"></a>

您可以使用 [Neptune 大量載入器](bulk-load.md)，或在支援的查詢語言 (例如 [openCypher](access-graph-opencypher.md)) 中使用應用程式邏輯，將資料匯入至 Neptune。

Neptune 大量載入器是匯入大量資料的偏好方法，因為如果您遵循[最佳實務](bulk-load-optimize.md)，它可提供最佳化的匯入效能。大量載入器支援[兩種不同的 CSV 格式](bulk-load-tutorial-format.md)，您可以使用上面 [匯出資料](#migration-data-exporting) 一節中提到的開放原始碼公用程式，將從 Neo4j 匯出的資料轉換為這些格式。

您還可以使用 OpenCypher，搭配用於剖析、轉換和匯入的自訂邏輯來匯入資料。您可以透過 [HTTPS 端點](access-graph-opencypher-queries.md) (建議使用) 或使用 [Bolt 驅動程式](access-graph-opencypher-bolt.md)來提交 OpenCypher 查詢。