圖數據庫——Neo4j(一)內部結構特點

本篇主要分析介紹Neo4j的內部結構特點.

Neo4j主要通過構成圖來存儲數據,圖中的數據包括節點、關係以及節點的屬性和關係的屬性,關係可以是雙向的,也可以是隻有單向的.

以下是它的一些特點

  • 支持完整的ACID(原子性、一致性、隔離性和持久性)

  • 支持常數級時間複雜度的圖遍歷

  • 支持查詢的數據導出爲JSON和XLS格式

  • 支持通過瀏覽器圖形化界面形式訪問

  • 可以通過多種語言進行訪問管理(Java、Python、Ruby、PHP、C#、Js)

原生處理(native processing)

關於原生處理能力的定義,《圖數據庫》裏面提到,假如圖數據庫可存在免索引鄰接(Index Free Adjacency)屬性,那麼就是具有原生處理能力. 這裏的免索引鄰接主要是對用非原生圖數據庫裏使用的全局索引而言的,也就是每個節點都會維護其相鄰節點的引用,這樣可以提供快速高效的圖遍歷性能,擁有免索引鄰接的圖數據庫引擎遍歷整個圖的複雜度爲O(n) ,而使用索引的複雜度則是O(nlogn) ,但是在實際中,如果遇到要刪除一個有大量連接的節點,這時的操作代價就會非常高昂. 在 [1] 中提出ArangoDB提出了一種混合索引的方式,能夠避免這類缺點.

原生圖存儲(native graph storage)

關於Neo4j的存儲結構,Neo4j將圖結構和屬性數據等進行了分離,以此提供高性能的圖遍歷.

這裏寫圖片描述

圖中的節點和聯繫的存儲文件都是固定大小的,每個記錄長度爲9字節,因此可以可以在O(1) 的時間複雜度下計算位置.

  • 節點(指向聯繫和屬性的單向鏈表,neostore.nodestore.db):第一個字節,表示是否被使用的標誌位,後面4個字節,代表關聯到這個節點的第一個關係的ID,再接着的4個字符,代表第一個屬性ID,後面緊接着的5個字符是代表當前節點的標籤,指向該節點的標籤存儲,最後一個字符作爲保留位.

  • 聯繫(雙向鏈表,neostore.relationshipstore.db):第一個字節,表示是否被使用的標誌位,後面4個字節,代表起始節點的ID,再接着的4個字符,代表結束個節點的ID,然後是關係類型佔用5個字節,然後依次接着是起始節點的上下聯繫和結束節點的上下節點,以及一個指示當前記錄是否位於聯繫鏈的最前面.

同時還有屬性存儲(neostore.propertystore.db)也是固定大小,每個屬性記錄包括4個屬性塊(一個屬性記錄最多容納4個屬性)和指向屬性鏈中下一個屬性的ID. 屬性記錄包括屬性類型和指向屬性索引文件的指針(neostore.propertysotre.db.index). 同時屬性記錄中可以內聯和動態存儲,在屬性值存儲佔用小時,會直接存儲在屬性記錄中,對於大屬性值,可以分別存儲在動態字符存儲(neostore.propertysotre.db.strings)和動態數組存儲(neostore.propertysotre.db.arrays)中,由於動態記錄同樣由記錄大小固定的記錄鏈表組成,因此大字符串和大數組會佔據多個動態記錄.

緩存策略

這裏寫圖片描述

參考資料:《圖數據庫》

[1]. Index Free Adjacency or Hybrid Indexes for Graph Databases

知識共享許可協議
本作品採用知識共享署名-非商業性使用-相同方式共享 3.0 中國大陸許可協議進行許可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章