

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

# 應用程式從 Neo4j 遷移到 Neptune
<a name="migration-app-migration"></a>

在您已將資料從 Neo4j 遷移到 Neptune 之後，下一步是遷移應用程式本身。與資料一樣，根據您使用的工具、需求、架構差異等，有多種遷移應用程式的方法。下面概述了您通常需要在此過程中考慮的事項。

## 從 Neo4j 移到 Neptune 時遷移連線
<a name="migration-app-connections"></a>

如果您目前未使用 Bolt 驅動程式，或想要使用替代驅動程式，您可以連線至 [HTTPS 端點](access-graph-opencypher-queries.md)，該端點可提供對所傳回資料的完整存取權。

如果您確實具有使用 [Bolt 通訊協定](access-graph-opencypher-bolt.md)的應用程式，則可以將這些連線遷移到 Neptune，並讓您的應用程式可以使用與您在 Neo4j 中使用的同一驅動程式進行連線。若要連線到 Neptune，您可能需要對應用程式進行下列一或多個變更：
+ 必須更新 URL 和連接埠，才能使用叢集端點和叢集連接埠 (預設值為 8182)。
+ Neptune 會要求所有連線都使用 SSL，因此您需要為每個連線指定加密。
+ Neptune 透過指派 [IAM 政策和角色](iam-auth.md)來管理身分驗證。IAM 政策和角色在應用程式內提供極為靈活的使用者管理層級，因此在設定叢集之前，務必先閱讀並了解 [IAM 概觀](iam-auth.md)中的資訊。
+ Bolt 連線在 Neptune 中的行為與在 Neo4j 中的行為會在幾個方面有所不同，如 [Neptune 中的 Bolt 連線行為](access-graph-opencypher-bolt.md#access-graph-opencypher-bolt-connections) 中所述。
+ 您可以在 [使用 openCypher 和 Bolt 的 Neptune 最佳實務](best-practices-opencypher.md) 中找到更多的資訊和建議。

在 [使用 Bolt 通訊協定，對 Neptune 進行 openCypher 查詢](access-graph-opencypher-bolt.md) 中，有一些常用語言 (例如 Java、Python、.NET 和 NodeJS) 的程式碼範例，以及連線案例 (例如使用 IAM 身分驗證) 的程式碼範例。

## 從 Neo4j 移到 Neptune 時將查詢路由到叢集執行個體
<a name="migration-app-routing"></a>

Neo4j 的用戶端應用程式會使用[路由驅動程式](https://neo4j.com/docs/driver-manual/1.7/client-applications/#routing_drivers_bolt_routing)，並指定[存取模式](https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/#driver-transactions-access-mode)，以將讀取和寫入請求路由至因果叢集中適當的伺服器。

將用戶端應用程式遷移至 Neptune 時，請使用 [Neptune 端點](feature-overview-endpoints.md)將查詢有效率地路由至叢集中適當的執行個體：
+ Neptune 的所有連線都應在 URL 中使用 `bolt://`，而不是 `bolt+routing://` 或 `neo4j://`。
+ 叢集端點會連線至叢集中目前的主要執行個體。使用叢集端點將寫入請求路由至主要執行個體。
+ 讀取器端點會將[連線分發](best-practices-general-basic.md#best-practices-general-loadbalance)到叢集中的僅供讀取複本執行個體。如果您具有的單一執行個體叢集沒有僅供讀取複本執行個體，則讀取器端點會連線到支援寫入操作的主要執行個體。如果叢集確實包含一或多個僅供讀取複本執行個體，則將寫入請求傳送至讀取器端點會產生例外狀況。
+ 叢集中的每個執行個體也可以具有自己的執行個體端點。如果您的用戶端應用程式需要將請求傳送至叢集中的特定執行個體，請使用執行個體端點。

如需詳細資訊，請參閱[Neptune 端點考量](feature-overview-endpoints.md#feature-overview-endpoint-considerations)。

## Neptune 中的資料一致性
<a name="migration-app-consistency"></a>

使用 Neo4j 因果叢集時，僅供讀取複本最終會與核心伺服器一致，但用戶端應用程式可以使用[因果鏈](https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/#driver-transactions-causal-chaining)來確保因果一致性。因果鏈需要在交易之間傳遞書籤，這允許用戶端應用程式寫入核心伺服器，然後從僅供讀取複本讀取自己的寫入。

在 Neptune 中，僅供讀取複本執行個體最終會與寫入器一致，複本延遲通常少於 100 毫秒。不過，在複寫變更之前，複本執行個體上看不到對現有邊緣和頂點的更新，以及新增的邊緣和頂點。因此，如果您的應用程式需要透過讀取每個寫入以在 Neptune 上立即保持一致性，請使用叢集端點進行先讀後寫操作。這是使用叢集端點進行讀取操作的唯一時機。在所有其他情況下，請使用讀取器端點進行讀取。

## 將查詢從 Neo4j 遷移到 Neptune
<a name="migration-app-queries"></a>

儘管 Neptune [對 OpenCypher 的支援](https://aws.amazon.com/blogs/database/announcing-the-general-availability-of-opencypher-support-for-amazon-neptune/)大幅地減少了從 Neo4j 遷移查詢所需的工作量，但仍有一些在遷移時要評估的差異：
+ 如上面 [資料模型最佳化](migration-data-migration.md#migration-data-model-optimization) 中所討論，您可能需要對資料模型進行修改，以便為 Neptune 建立最佳化的圖形資料模型，因而需要對您的查詢和測試進行變更。
+ Neo4j 提供了各種 Cypher 特定的語言延伸模組，這些延伸模組不包括在由 Neptune 實作的 OpenCypher 規格中。根據使用案例和使用的功能，OpenCypher 語言內可能有因應措施，或使用 Gremlin 語言，或透過其他機制 (如 [重寫 Cypher 查詢以在 Neptune 上的 OpenCpher 中執行](migration-opencypher-rewrites.md) 中所述)。
+ 應用程式通常會使用其他中介軟體元件與資料庫互動，而不是 Bolt 驅動程式本身。請檢查 [Neptune 與 Neo4j 的相容性](migration-compatibility.md) 以查看是否支援您正在使用的工具或中介軟體。
+ 在容錯移轉的情況下，Bolt 驅動程式可能會繼續連線到先前的寫入器或讀取器執行個體，因為提供給連線的叢集端點已解析為 IP 地址。您應用程式中的適當錯誤處理應該處理這個問題，如 [在容錯移轉之後建立新連線](best-practices-opencypher.md#best-practices-opencypher-renew-connection) 中所述。
+ 交易由於無法解決的衝突或鎖定等待逾時而取消時，Neptune 會以 `ConcurrentModificationException` 回應。如需詳細資訊，請參閱[引擎錯誤代碼](errors-engine-codes.md)。根據最佳實務，用戶端應一律截獲和處理這些例外狀況。

  當多個執行緒或多個應用程式同時寫入系統時，偶爾會發生 `ConcurrentModificationException`。由於[交易隔離層級](transactions-neptune.md#transactions-neptune-mutation)，因此這些衝突有時可能是不可避免的。
+ Neptune 支援在相同的資料上執行 Gremlin 和 OpenCypher 查詢。這表示在某些情況下，您可能需要考慮使用查詢功能更強大的 Gemlin，來執行查詢的某些功能。

如上面 [佈建基礎設施](migration-provisioning-infrastructure.md) 所討論，每個應用程式都應該經過調整適當大小的練習，以確保執行個體數量、執行個體大小和叢集拓撲都針對應用程式的特定工作負載進行最佳化。

這裡針對遷移應用程式討論的考量是最常見的，但這不是一個詳盡的清單。每個應用程式都是唯一的。如果您有其他問題，請聯絡 AWS 支援或與您的客戶團隊互動。

## 遷移 Neo4j 特定功能和工具
<a name="migration-app-neo4j-specific"></a>

Neo4j 具有各種自訂功能和附加元件，其中具有您的應用程式可能依賴的功能。評估遷移此功能的需求時，通常有助於調查內部是否有更好的方法來 AWS 實現相同的目標。考慮到 [ Neo4j 和 Neptune 之間的架構差異](migration-architectural-differences.md)，您通常可以找到利用其他 AWS 服務或[整合](integrations.md)的有效替代方案。

如需 Neo4J 特定功能和所建議因應措施的清單，請參閱 [Neptune 與 Neo4j 的相容性](migration-compatibility.md)。