天天看點

protege和neo4j聯系_neo4j-高效的原因(節點關系屬性存儲)

節點存儲檔案

neo4j有一個節點存儲檔案,用來存儲節點的記錄,檔案名為neostore.nodestore.db

節點記錄的長度是固定大小(9位元組)

格式為:Node:inUse+nextRelld+nextPropld

protege和neo4j聯系_neo4j-高效的原因(節點關系屬性存儲)

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

protege和neo4j聯系_neo4j-高效的原因(節點關系屬性存儲)

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).屬性索引檔案主要用于存儲屬性的名稱,屬性索引的值部分存儲的是指向動态記憶體的記錄(長度不夠存儲的時候會去申請動态記憶體,并放在動态存儲檔案中)或内聯值.

protege和neo4j聯系_neo4j-高效的原因(節點關系屬性存儲)

image

inUse: 1 代表正常使用的屬性, 0 已經删除的屬性

keyindexId:屬性id

nextProId:下一個屬性的id , 單向連結清單

propBlock:存儲長度 29-5 = 24 個位元組長度

動态存儲分類

動态存儲,是屬性存儲長度不足時需要用到的存儲檔案

分類:1.動态字元串存儲 2.動态數組存儲

如果一條資料長到一個動态存儲仍無法完全容納時,可以申請多個動态存儲記錄邏輯上進行連接配接

總結:

Neo4j資料庫有一個.id檔案保持對未使用記錄的跟蹤,用來回收未使用記錄占用的空間,節點和關系存儲檔案隻關心圖的基本存儲結構而不是屬性資料,這兩種記錄都是固定大小,進而達到高性能周遊的關鍵設計決策.幾點記錄和關系記錄都是相當輕量級的,由指向聯系和屬性清單的指針構成

一個節點的所有屬性被記錄到一個單向連結清單上面.隻有指向下一個屬性的指針,沒有指向上一個屬性的指針

兩個節點之間的所有關系被記錄到一個雙向連結清單上面,既有指向上一個關系的指針,也有指向下一個關系的指針

節點存儲檔案和關系存儲檔案都是固定長度,隻關心結構,不關心屬性資料,屬性存儲檔案也是固定長度,隻關心資料,不關心結構.當長度不足時,會去申請動态存儲,将超出的資料長度存放在動态存儲裡面,并将位址存放在屬性存儲檔案中.查找的時候進行拼接