資料從 Neo4j 遷移到 Neptune - Amazon Neptune

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

資料從 Neo4j 遷移到 Neptune

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

注意

請參閱 AWS 資料庫部落格中的使用全自動化公用程式將 Neo4j 圖形資料庫遷移至 Neptune,以取得如何執行離線資料遷移之範例的完整逐步解說。

評估從 Neo4j 到 Neptune 的資料遷移

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

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

線上遷移較為複雜,因為在遷移資料時,應用程式仍然需要接受讀取和寫入流量。每個線上遷移的確切需求可能會有所不同,但一般架構通常會與下列架構類似:

從 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 中將此項對應到 BoolBoolean

  • 數值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 程序匯出到 CSVGraphML。雖然可以匯出到其他格式,但有開放原始碼工具可將從 Neo4j 匯出的 CSV 資料轉換為 Neptune 大量載入格式,並且也有開放原始碼工具可將從 Neo4j 匯出的 GraphML 資料轉換為 Neptune 大量載入格式。

您也可以使用各種 APOC 程序將資料直接匯出到 Amazon S3。匯出至 Amazon S3 儲存貯體預設為停用,但可以使用 Neo4j APOC 文件中匯出至 Amazon S3 中反白的程序來啟用此儲存貯體。

遷移到 Neptune 時從 Neo4j 匯入資料

您可以使用 Neptune 大量載入器,或在支援的查詢語言 (例如 openCypher) 中使用應用程式邏輯,將資料匯入至 Neptune。

Neptune 大量載入器是匯入大量資料的偏好方法,因為如果您遵循最佳實務,它可提供最佳化的匯入效能。大量載入器支援兩種不同的 CSV 格式,您可以使用上面 匯出資料 一節中提到的開放原始碼公用程式,將從 Neo4j 匯出的資料轉換為這些格式。

您還可以使用 OpenCypher,搭配用於剖析、轉換和匯入的自訂邏輯來匯入資料。您可以透過 HTTPS 端點 (建議使用) 或使用 Bolt 驅動程式來提交 OpenCypher 查詢。