本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資料從 Neo4j 遷移到 Neptune
從 Neo4j 遷移到 Amazon Neptune 時,遷移資料是過程中的主要步驟。有多種方法遷移資料。正確的方法取決於應用程式的需求、資料大小和所需的遷移類型。不過,其中許多遷移都需要評估相同的考量,其中幾個會在下面反白顯示。
注意
請參閱 AWS 資料庫部落格
評估從 Neo4j 到 Neptune 的資料遷移
評估任何資料遷移時的第一步是確定如何遷移資料。這些選項取決於要遷移之應用程式的架構、資料大小,以及遷移期間的可用性需求。通常,遷移往往分為兩種類別之一:線上或離線。
離線遷移往往是最簡容易完成的,因為應用程式在遷移期間不接受讀取或寫入流量。在應用程式停止接受流量之後,可以匯出、最佳化、匯入資料,並在重新啟用應用程式之前測試應用程式。
線上遷移較為複雜,因為在遷移資料時,應用程式仍然需要接受讀取和寫入流量。每個線上遷移的確切需求可能會有所不同,但一般架構通常會與下列架構類似:
資料庫的持續變更摘要需要在 Neo4j 中啟用,方法是設定 Neo4j 串流作為 Kafka 叢集的來源
。 一旦完成此操作,就可以遵循 遷移到 Neptune 時從 Neo4j 匯出資料 中的指示,以及稍後與 Kafka 主題相互關聯時提到的時間取得執行中系統的匯出。
然後,匯出的資料會遵循 遷移到 Neptune 時從 Neo4j 匯入資料 中的指示匯入至 Neptune。
來自 Kafka 串流的變更資料接著可以複製到 Neptune 叢集,方法是使用與從 Amazon Kinesis Data Streams 寫入至 Amazon Neptune
中所述架構類似的架構。請注意,變更複寫可以並行執行,以驗證新的應用程式架構和效能。 在驗證資料遷移之後,應用程式流量可被重新導向至 Neptune 叢集,且 Neo4j 執行個體可被解除委任。
從 Neo4j 遷移到 Neptune 的資料模型最佳化
Neptune 和 Neo4j 都支援標示的屬性圖 (LPG)。不過,Neptune 有一些架構和資料模型差異,您可以利用這些差異來最佳化效能:
最佳化節點和邊緣 ID
Neo4j 會自動產生數值長 ID。使用 Cypher,您可以按 ID 引用節點,但通常不鼓勵這樣做,而是傾向於透過編製索引的屬性查閱節點。
Neptune 可讓您為頂點和邊緣提供您自己的字串型 ID。如果您未提供自己的 ID,Neptune 會自動為新邊緣和頂點產生 UUID 的字串表示法。
如果您透過從 Neo4j 匯出資料,然後將其大量匯入至 Neptune,以將資料從 Neo4j 遷移至 Neptune,則您可以保留 Neo4j 的 ID。由 Neo4j 產生的數值可在匯入至 Neptune 時作為使用者提供的 ID,其中它們是以字串表示,而不是數值。
不過,在某些情況下,您可能想要提升頂點屬性以成為頂點 ID。就像使用編製索引的屬性查閱節點是在 Neo4j 中尋找節點的最快方法一樣,按 ID 查閱頂點是在 Neptune 中尋找頂點的最快方法。因此,如果您可以識別包含唯一值的適當頂點屬性,則應考慮在大量載入 CSV 檔案中以指定的屬性值取代頂點 ~id。如果這樣做,您還必須在 CSV 文件中重寫任何對應的 ~from 和 ~to 邊緣值。
將資料從 Neo4j 遷移到 Neptune 時的結構描述限制條件
在 Neptune 內,唯一可用的結構描述限制條件是節點或邊緣 ID 的唯一性。鼓勵需要利用唯一性限制條件的應用程式來查看此方法,透過指定節點或邊緣 ID 來實現唯一性限制條件。如果應用程式使用了多個資料行做為唯一性限制條件,則 ID 可能會設定為這些值的組合。例如,id=123, code='SEA'
可以表示為 ID='123_SEA'
) 來實現複雜的唯一性限制條件。
將資料從 Neo4j 遷移到 Neptune 時的邊緣方向最佳化
當節點、邊緣或屬性新增至 Neptune 時,它們會自動以三種不同的方式編製索引,搭配選用的第四個索引。由於 Neptune 建置和使用索引的方式,因此遵循傳出邊緣的查詢比使用傳入邊緣的查詢更有效率。根據 Neptune 的圖形資料儲存模型,這些是使用 SPOG 索引的主題型搜尋。
如果在將資料模型和查詢遷移至 Neptune 時,您發現最重要的查詢依賴於周遊高度散發的傳入邊緣,您可能想要考慮更改模型,以便這些周遊遵循傳出邊緣,尤其是在您無法指定要周遊的邊緣時。若要這麼做,請反轉相關邊緣的方向,並更新邊緣標籤以反映此方向變更的語義。例如,您可能會變更:
person_A — parent_of — person_B to: person_B — child_of — person_A
若要在大量載入邊緣 CSV 檔案中進行此變更,只要交換 ~from
和 ~to
資料行標頭,然後更新 ~label
資料行的值即可。
作為反轉邊緣方向的替代方法,您可以啟用第四個 Neptune 索引,即 OSGP 索引,這使得周遊傳入邊緣或物件型搜索更有效。但是,啟用此第四個索引將降低插入率,並且需要更多的儲存體。
將資料從 Neo4j 遷移到 Neptune 時篩選最佳化
Neptune 會進行最佳化,以在將屬性篩選為最具選擇性的可用屬性時發揮最佳效果。使用多個篩選器時,會為每個篩選器找到相符的項目集,然後計算所有相符集的重疊部分。如果可能,將多個屬性合併為單一屬性,這可將索引查詢的次數降至最低,並減少查詢的延遲。
例如,此查詢會使用兩個索引查詢和一個聯結:
MATCH (n) WHERE n.first_name='John' AND n.last_name='Doe' RETURN n
這個查詢會使用單一索引查詢擷取相同的資訊:
MATCH (n) WHERE n.name='John Doe' RETURN n
Neptune 支援與 Neo4j 不同的資料類型。
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 進行全文檢索搜尋整合時,可讓您編製地理位置屬性的索引。
將多值屬性從 Neo4j 遷移到 Neptune
Neo4j 允許簡單類型的異質清單
不過,在屬性資料圖中,Neptune 對於頂點屬性只允許集合或單一基數,而對於邊緣屬性,則只允許單一基數。因此,無法將包含重複值的 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 匯出資料
從 Neo4j 匯出資料時,使用 APOC 程序匯出到 CSV
您也可以使用各種 APOC 程序將資料直接匯出到 Amazon S3。匯出至 Amazon S3 儲存貯體預設為停用,但可以使用 Neo4j APOC 文件中匯出至 Amazon S3
遷移到 Neptune 時從 Neo4j 匯入資料
您可以使用 Neptune 大量載入器,或在支援的查詢語言 (例如 openCypher) 中使用應用程式邏輯,將資料匯入至 Neptune。
Neptune 大量載入器是匯入大量資料的偏好方法,因為如果您遵循最佳實務,它可提供最佳化的匯入效能。大量載入器支援兩種不同的 CSV 格式,您可以使用上面 匯出資料 一節中提到的開放原始碼公用程式,將從 Neo4j 匯出的資料轉換為這些格式。
您還可以使用 OpenCypher,搭配用於剖析、轉換和匯入的自訂邏輯來匯入資料。您可以透過 HTTPS 端點 (建議使用) 或使用 Bolt 驅動程式來提交 OpenCypher 查詢。