Cassandra

在 Cassandra DB 中建模圖數據

  • February 27, 2020

我想使用 Apache Cassandra 根據屬性圖模型儲存大量的圖數據。該模型包含以下實體:

  • Vertices:包含鍵/值對(屬性)的映射。一些鍵應該被索引以便查詢(見下文)。
  • :在給定方向上將****兩個頂點相互連接起來。包含標籤和可能的一些邊緣數據。邊緣數據是鍵/值對的映射,其中一些鍵也應該被索引以進行查詢。

頂點和邊都有唯一的主鍵,可以是字元串或整數值。

例子:

#A vertex
{node_type:'module',pk: 1,...}
#Another vertex
{node_type:'function',pk: 2,...}

#An edge
{incoming_vertex: 1,outgoing_vertex: 2,label: 'body',data : {}}

我想在圖表上執行以下類型的查詢:

  • 根據頂點的主鍵(例如“使用 pk = a5f …”獲取頂點)或一個或多個索引屬性的值(例如“使用node_type = 'module'和…獲取所有頂點”)檢索頂點列表。
  • 從給定頂點沿其邊遍歷圖形,使用邊標籤、方向和一個或多個索引邊屬性來確定所採用的路徑(例如“獲取通過帶有標籤主體和屬性的傳出邊連接到頂點 A 的所有頂點… = …)。

另外,我有以下要求和邊界條件:

  • 檢索給定頂點的邊列表應該盡可能高效(理想情況下為 O(1))。
  • 邊的數量將遠大於圖中的頂點數量。
  • 該模型應擴展到數十億個頂點和數千億個邊(提供適當的硬體)。
  • 圖數據通常只寫入一次,多次讀取,因此模型可以以寫入性能為代價來優化查詢性能。

我對數據模型的最初想法如下:

  • 分別對頂點和邊使用一個列族,其中行鍵是頂點/邊的主鍵,單個文本列包含其 JSON 數據。頂點/邊屬性上的索引被建模為附加列(其數據被非規範化並在頂點/邊數據更改時手動更新)
  • 使用一個動態列族來管理頂點的鄰接(邊)列表,複合主鍵包含頂點的主鍵、邊的主鍵、邊標籤和邊方向(傳入或傳出)每個頂點。

這是一個合理的數據模型嗎?關於如何實現這一點的任何其他建議?

對於 Cassandra 上的圖形數據庫,請查看TitanDB

您需要的已經在 TitanDB 中實現了。實現自己的圖形數據庫並非易事,而且非常耗時。在大多數情況下,經過驗證的解決方案是最好的。(順便說一句,我不參與 TitanDB 開發或業務。)我不了解您的案例,但我認為沒有理由實施新的東西,除了作為一種愛好。

更新我在數據庫中找到了一份關於 Titan GraphDB 數據模型的白皮書:https ://github.com/thinkaurelius/titan/wiki/Titan-Data-Model 。它提供了一些提示如何為圖形設計數據儲存。

Aurelius 現在也是 Datastax 的一部分,他們致力於在 Cassandra 中儲存大圖的組合解決方案。

對於 Cassandra 上的圖形數據庫,請查看已經實現並支持 CQL 和 Gremlin 語法的Datastax Graph 。

引用自:https://dba.stackexchange.com/questions/95964