Neo4j資料庫簡介,neo4j資料庫
作為世界先進的圖資料庫,Neo4j成為了時下許多互連網公司的首選。Neo4j是基於java開發的開源圖資料庫,也是一種NoSQL資料庫。Neo4j在保證對資料關係的良好刻畫的同時,還支援傳統關係型資料的ACID特性,並且在儲存效率,叢集支援以及失效備援等等方面都有著不錯的表現。近來因為實驗室的項目的關係,對Neo4j有了一定的瞭解。同時,我也對其設計思想和架構都產生了很大的興趣,所以寫下這篇部落格,協助大家更好地瞭解這一資料庫,也分享一下以及的認識。
設計理念
Neo4j的設計動機是為了更好地同時也更高效地描述實體之間的關係。在現實生活中,每一個實體都於周圍的其他實體有著千絲萬縷的關係,這些關係裡面所儲存的資訊甚至要大於身體本身的屬性。然後傳統的關係型資料庫更注重刻畫實體內部的屬性,實體與實體之間的關係通常都是利用外鍵來實現。所以在求解關係的時候通常需要join操作,而join操作通常又是耗時的。互連網尤其是移動互連網的爆髮式增長本來就使得傳統關係型資料庫不堪重負,再加上諸如社交網路等應用對於關係的高需求,可以說關係型資料庫已經是毫無優勢。而圖資料庫作為重點描述資料之間關係的資料庫應運而生,成為了NoSQL中非常重要的一部分。而Neo4j正是圖資料庫中最為優秀的之一
Neo4j資料庫只有兩種類型的資料:
- 節點Node:節點類似於E-R圖種的實體(entity),每個實體可以有0到多個屬性,這些屬性以key-value對的形式存在,並且對屬性沒有類別要求,也無需提前定義。另外,還允許給每個節點打上標籤,以區別不同類型的節點。
- 關係Relationship: 關係類似於E-R圖種的關係(relationship),一個關係有一個起始節點和一個終止節點構成。另外和node一樣,關係也可以有多個屬性已經標籤
其具體的結構如:而一個實際的圖資料庫例子就如所示的這樣:
正是基於這樣的設計理念,Neo4j有了以下這些特性:
- 關係在建立的時候就已經實現了,因而在查詢關係的時候是一個O(1)的操作
- 所有的關係在Neo4j中都是同等重要的
- 提供了圖的深度優先搜尋、廣度優先搜尋、最短路徑、簡單路徑已經Dijkstra等等演算法
Neo4j的儲存結構
現在讓我們來看看資料在Neo4j中是如何儲存的,首先是節點Node的格式: Node:in_use(byte)+next_rel_id(int)+next_prop_id(int)
,每一位的具體意義如下:
- in_use:1表示該節點被使用,0表示被刪除
- next_rel_id(int):該節點下一個關係id
- next_prop_id(int):該節點下一個屬性的id
Relation格式: in_use+first_node+second_node+rel_type+first_prev_rel_id+first_next_rel_id+second_prev_rel_id+second_next_rel_id+next_prop_id
- in_use,next_prop_id:同上
- first_node:當前關係的起始節點
- second_node:當前關係的終止節點
- rel_type:關聯類型
- first_prev_rel_id & first_next_rel_id:起始節點的前一個和後一個關係id
- second_prev_rel_id & second_next_rel_id:終止節點的前一個和後一個關係id
相信看了存數結構之後,大家知道為什麼Neo4j在查詢節點關係的時候會如此之快了,因為每一個節點有哪些關係都是直接存在該節點的定義域內的,直接存取就行了,根本不需要再去尋找另外一張表。
下面舉一個圖的遍曆的例子:
- 從節點1開始,寬度優先遍曆,其儲存結構為:01 00000002 ffffffff
- 其下一個關係id是2,訪問關係2:01 00000001 00000004 00000000 ffffffff 00000001 ffffffff ffffffff ffffffff 得出node 1 -> node 4,同時下個關係是1
- 關係1: 01 00000001 00000003 00000000 00000002 00000000 00000003 ffffffff ffffffff node1 -> node 3,node3 有其他關係,所以將node3存入隊列,同時訪問關係0
- 關係0:01 00000001 00000002 00000000 00000001 ffffffff ffffffff ffffffff ffffffff node1 -> node2,訪問完成node1的所有關係,從隊列中退出node3
- 用於上文相同的方法訪問node3
- 最後結果如下:
(1)–[KNOWS,2]–>(4)(1)–[KNOWS,1]–>(3)(1)–[KNOWS,0]–>(2)(1)–[KNOWS,1]–>(3)–[KNOWS,5]–>(7)(1)–[KNOWS,1]–>(3)–[KNOWS,4]–>(6)(1)–[KNOWS,1]–>(3)–[KNOWS,3]–>(5)
Neo4j與關係型資料庫的區別
其實通過上述的講解,相信大家都對neo4j與RDBMS(Relational Database Management System)的區別有了一定的認識,現在再用下面的表格來重新整理一下:
Neo4j |
RDBMS |
允許對資料的簡單且多樣的管理 |
高度結構化的資料 |
資料添加和定義靈活,不受資料類型和數量的限制,無需提前定義 |
表格schema需預定義,修改和添加資料結構和類型複雜,對資料有嚴格的限制 |
常數時間的關係查詢操作 |
關係查詢操作耗時 |
提出全新的查詢語言cypher,查詢語句更加簡單 |
查詢語句更為複雜,尤其涉及到join或union操作時 |
最後再以下面兩張圖來展示一下兩者在查詢關係時的區別:RDBMSNeo4j
關於Neo4j具體的安裝和使用,不是文章的重點,如果想要真正上手用Neo4j,可以到Neo4j官網上面有很多資料
neo4j是什?怎配置?可以單獨使用?
Neo4j是一個嵌入式,基於磁碟的,支援完整事務的Java持久化引擎,它在映像中而不是表中儲存資料。Neo4j提供了大規模可擴充性,在一台機器上可以處理數十億節點/關係/屬性的映像,可以擴充到多台機器並行運行。相對於關聯式資料庫來說,圖形資料庫善於處理大量複雜、互串連、低結構化的資料,這些資料變化迅速,需要頻繁的查詢——在關聯式資料庫中,這些查詢會導致大量的表串連,因此會產生效能上的問題。Neo4j重點解決了擁有大量串連的傳統RDBMS在查詢時出現的效能衰退問題。通過圍繞圖形進行資料建模,Neo4j會以相同的速度遍曆節點與邊,其遍曆速度與構成圖形的資料量沒有任何關係。此外,Neo4j還提供了非常快的圖形演算法、推薦系統和OLAP風格的分析,而這一切在目前的RDBMS系統中都是無法實現的。
neo4j資料庫資料庫在伺服器上,程式在自己電腦上,現在想讓程式中與資料庫連接,不使用rest,java怎弄