1、什么是Neo4j
Neo4j是由java實現的開源NOSQL圖數據庫
數據庫分為關系型和非關系型兩種類型。
其中非關系型又分為Graph(圖形),Document(文檔),Cloumn Family(列式),以及Key-Value Store(KV),
這四種類型數據庫分別使用不同的數據結構進行存儲。因此它們所適用的場景也不盡相同。
特點:
1、界面友好: 前端D3.js
2、查詢語言: Cypher
3、ACID事務
A、體系結構:
Neo4j最初的動機是為了更好的描述實體之間的聯系
1、免索引鄰接
(1)免索引鄰接使用遍歷物理關系的方法查找,比起全局索引代價要小的多
(2)當索引建立后,反向遍歷時,索引就會失效
所以免索引鄰接機制,使得圖庫上關系查詢效率非常高
B、存儲結構:
節點和關系都是采用固定長度存儲。
(1)節點(Node)
包含一個和多個屬性(properties),標簽(Label)
長度: 9字節
存儲文件名:neostore.nodestore.db
格式:Node:inUse+newRelId+newPropId
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[12,used=true,rel=11,prop=22]采用固定字節長度的記錄可以快速地查詢到存儲文件中的節點。
如果有個ID為100的節點。我們知道該記錄在存儲文件的第900個字節。基於這種查詢方式,查詢成本是O(1)
(2)關系(Relationship)
包含起始節點(startNode)和終止節點(endNode),一個和多個屬性,標簽,一個類型
長度: 33字節
存儲文件名: neostore.relationshipstore.db
格式: Relationship:inUse+firstNode+secondNode+relType+firstPreRelId+firstNextRelId+secondPrevRelId+secondNextRelId+nextPropId
inUse:,nextPropId: 作用同上。
firstNode: 當前關系的起始節點。
secondNode: 當前關系的終止節點。
relType: 關系的類型。
firstPrevRelId & firstNextRelId: 起始節點的前一個和后一個關系的ID。
secondPrevRelId & secondNextRelId: 終止節點的前一個和后一個關系ID。
數據解釋:
Relationship[0,used=true,source=1,target=0,type=0,sPrev=1,sNext=-1,tPrev=3,tNext=-1,prop=1]
Relationship[0,used=true,source=2,target=1,type=1,sPrev=2,sNext=-1,tPrev=-1,tNext=0,prop=3]
(3)屬性(property)
長度:9字節
存儲文件名:neostore.propertystore.db.index
格式:property:inUse+propCount+keyBlockId
屬性索引的值部分存儲的是指向動態內存的記錄或者內聯值,短字符串和短數組會直接內聯在屬性存儲記錄中。當長度超過屬性記錄中propBlock長度限制之后
會存儲到其他的動態存儲文件中
C、遍歷方式
從一個給定節點定位關系鏈中第一個關系的位置,然后計算它在關系存儲的偏移量獲取,使用關系ID乘關系的固定大小即可定位存儲文件中的正確位置
在關系記錄中,搜索第二個字段可以找第二個節點的ID,用節點固定大小乘節點ID可以得到節點在存儲中的正確位置
D、存儲優化
盡量將短字符的屬性直接存儲在屬性文件中,壓縮和內聯存儲
Neo4j的安裝
批量導入工具的使用
Cypher語句