節點存儲檔案
neo4j有一個節點存儲檔案,用來存儲節點的記錄,檔案名為neostore.nodestore.db
節點記錄的長度是固定大小(9位元組)
格式為:Node:inUse+nextRelld+nextPropld
image
inUse: 1 表示該節點正常使用, 0 表示該節點被删除
nextRelId: 該節點的下一個關系 id
nextPropId:該節點的下一個屬性id
可以将存儲記錄看成是下面的樣子
Node[0,used=true,rel=9,prop=-1]
Node[1,used=true,rel=1,prop=0]
Node[2,used=true,rel=2,prop=2]
Node[3,used=true,rel=2,prop=4]
Node[4,used=true,rel=4,prop=6]
是以如果我們想要查詢id為100的節點,就可以準确的知道該節點記錄在存儲檔案的第900位元組,
基于這種查找方式,資料庫可以直接計算出節點的位置,也就是O(1)的效率,而不是像關系型資料庫O(log(n))的效率
關系存儲檔案
對應的也有一個關系存儲檔案,用來存儲關系的記錄.檔案是neostore.relationshipstore.db,長度也是固定的
關系長度(33位元組)
格式為:
Relationship:inUse+firstNode+secondNode+relType+firstPrevRelId+firstNextRelId+secondPrevRelId+secondNextId+nextProId
image
inUse: 1 表示該關系正常使用, 0 表示該關系被删除
firstNode:目前關系的起始節點
secondNode:目前關系的終止節點
relType:關系的類型
firstPrevRelId & firstNextRelId :起始節點前一個關系和後一個關系的Id
secondPrevRelId & secondNextId : 終止節點前一個關系和後一個關系的Id
nextProId: 該關系的下一個屬性id
關系記錄可以看成下面的方式
Relationship[0,used=true,source=1,target=0,type=0,sPrev=1,sNext=-1,tPrev=3,tNext=-1,prop=1]
Relationship[1,used=true,source=2,target=1,type=1,sPrev=2,sNext=-1,tPrev=-1,tNext=0,prop=3]
Relationship[2,used=true,source=3,target=2,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=1,prop=5]
屬性的存儲
屬性記錄的實體存放位置是neostore.propertystore.db檔案中,屬性的存儲也是固定長度(不過不用擔心長度不夠,長度不夠的時候會去申請動态存儲),每個屬性記錄包含4個屬性塊和屬性鍊中下一個屬性的id.屬性鍊是單向連結清單,關系鍊是雙向連結清單.因為neo4j是基于java開發,是以一個屬性記錄中可以包含任何java虛拟機(JVM)支援的基本資料類型/字元串/數組/屬性索引檔案(neostore.propertystore.db.index).屬性索引檔案主要用于存儲屬性的名稱,屬性索引的值部分存儲的是指向動态記憶體的記錄(長度不夠存儲的時候會去申請動态記憶體,并放在動态存儲檔案中)或内聯值.
image
inUse: 1 代表正常使用的屬性, 0 已經删除的屬性
keyindexId:屬性id
nextProId:下一個屬性的id , 單向連結清單
propBlock:存儲長度 29-5 = 24 個位元組長度
動态存儲分類
動态存儲,是屬性存儲長度不足時需要用到的存儲檔案
分類:1.動态字元串存儲 2.動态數組存儲
如果一條資料長到一個動态存儲仍無法完全容納時,可以申請多個動态存儲記錄邏輯上進行連接配接
總結:
Neo4j資料庫有一個.id檔案保持對未使用記錄的跟蹤,用來回收未使用記錄占用的空間,節點和關系存儲檔案隻關心圖的基本存儲結構而不是屬性資料,這兩種記錄都是固定大小,進而達到高性能周遊的關鍵設計決策.幾點記錄和關系記錄都是相當輕量級的,由指向聯系和屬性清單的指針構成
一個節點的所有屬性被記錄到一個單向連結清單上面.隻有指向下一個屬性的指針,沒有指向上一個屬性的指針
兩個節點之間的所有關系被記錄到一個雙向連結清單上面,既有指向上一個關系的指針,也有指向下一個關系的指針
節點存儲檔案和關系存儲檔案都是固定長度,隻關心結構,不關心屬性資料,屬性存儲檔案也是固定長度,隻關心資料,不關心結構.當長度不足時,會去申請動态存儲,将超出的資料長度存放在動态存儲裡面,并将位址存放在屬性存儲檔案中.查找的時候進行拼接