Neo4j底層數(shù)據(jù)原理

一.簡介

Neo4j是基于圖論實現(xiàn)的一種新型NoSQL數(shù)據(jù)庫。圖數(shù)據(jù)模型包括:屬性圖,超圖和三元組。

一.免索引鄰接

Neo4j的重要特點就是保證了關系數(shù)據(jù)的查詢速度。為什么關系會查詢快速呢,就是因為免索引鄰接屬性:數(shù)據(jù)庫中的每個節(jié)點都會維護與它相鄰節(jié)點的引用。這相當于每個節(jié)點都與它相鄰節(jié)點建立了微索引,這比全局索引的代價小很多。這意味著查詢時間與圖的規(guī)模無關,只與它附近節(jié)點的數(shù)量成正比。

相對于RDBMS的關系查詢的改進:

1)免索引鄰接使用遍歷物理關系的方法查找,比全局索引來說代價小很多。查詢一個索引的時間復雜度一般為0(log(n)),而遍歷物理關系的時間復雜度僅為0(1)。

2)RDBMS當索引建立后,試圖反向遍歷時,建立的索引就會不起作用了。免索引鄰接機制就不會有問題。


二.Neo4j底層數(shù)據(jù)結(jié)構(gòu)

從宏觀來講:

neo4j只有節(jié)點和關系兩種數(shù)據(jù)類型。

1)節(jié)點

節(jié)點存儲文件用來存儲節(jié)點的記錄,文件名為neostore.nodestore.db。節(jié)點記錄的長度為固定的大小,9字節(jié)。格式為:Node:inUse+nextRelId+nextPropId.

inUse:1表示該節(jié)點被正常使用,0表示該節(jié)點被刪除。

nextRelId:該節(jié)點的下一個關系Id.

nextPropId:該節(jié)點的下一個屬性Id.

固定字節(jié)長度的方式可以讓我很快計算出不同ID的存儲位置。

2)關系

關系存儲文件用來存儲關系的記錄,文件名為neostore.relationshipstore.db。跟節(jié)點的存儲一樣,關系存儲區(qū)的記錄大小也是固定的。格式為:Relationshop:inUse+firstNode+secondNode+relType+firstPreRelId+secondPrevRelId+secondNextRelId+nextPropId。

inUse,nextPropId:作用同上。

firstNode:當前關系的起始節(jié)點。

secondNode:當前關系的終止節(jié)點。

relType:關系的類型

firstPrevRelId,firstNextRelId:起始節(jié)點的前一個和后一個關系的ID.

secondPrevRelId,secondNextRelId:終止節(jié)點的前一個和后一個關系ID.

3)這樣的數(shù)據(jù)結(jié)構(gòu)的好處:

Neo4j節(jié)點和關系的存儲文件只關系圖的基本存儲結(jié)構(gòu)而不是屬性數(shù)據(jù)。這兩種記錄都使用固定大小的記錄,能方便根據(jù)ID快速計算存儲位置。并且節(jié)點和關系記錄變得相當輕量級。

4)屬性的存儲

屬性的記錄是存儲在neostore.propertystore.db文件中。與節(jié)點和關系記錄一樣,也是固定長度。每個屬性包含4個屬性塊和屬性鏈中下一個屬性ID.屬性鏈是單向鏈,關系鏈是雙向鏈。屬性索引文件主要用于存儲屬性的名稱,屬性索引的值部分存儲的是指向動態(tài)內(nèi)存的記錄或者內(nèi)聯(lián)值,短字符串和短數(shù)組會直接內(nèi)聯(lián)在屬性存儲記錄中。當長度超過屬性記錄的Propblock長度限制后,會單獨存儲在其他的動態(tài)存儲文件中。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容