圖數(shù)據(jù)庫簡(jiǎn)介
? 圖數(shù)據(jù)庫(Graph Database)是基于圖論實(shí)現(xiàn)的一種新型NoSQL數(shù)據(jù)庫。它的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)的查詢方式都是以圖論為基礎(chǔ)的。圖論中圖的基本元素為節(jié)點(diǎn)和邊,在圖數(shù)據(jù)庫中對(duì)應(yīng)的就是節(jié)點(diǎn)和關(guān)系。
? 在圖數(shù)據(jù)庫中,數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系通過節(jié)點(diǎn)和邊構(gòu)成一個(gè)圖結(jié)構(gòu)并在此結(jié)構(gòu)上實(shí)現(xiàn)數(shù)據(jù)庫的所有特性,如對(duì)圖數(shù)據(jù)對(duì)象進(jìn)行創(chuàng)建、讀取、更新、刪除(Create、Read、Update、Delete,簡(jiǎn)稱:CRUD)等操作的能力,還有處理事務(wù)的能力和高可用性等。
目前市面上較為流行的圖數(shù)據(jù)庫產(chǎn)品有以下幾種:

實(shí)時(shí)圖數(shù)據(jù)排名及增長(zhǎng)趨勢(shì)圖如下:


圖數(shù)據(jù)庫中的關(guān)系查詢示意圖:

neo4j簡(jiǎn)介
? Neo4j是由Java和Scala實(shí)現(xiàn)的開源NoSQL圖數(shù)據(jù)庫。自2003年開始研發(fā),直到2007年正式發(fā)布第一版。Neo4j的源代碼托管在GitHub上,技術(shù)支持托管在Stack Overflow和Neo4j Google討論組上。Neo4j現(xiàn)如今已經(jīng)被各種行業(yè)的數(shù)十萬家公司和組織采用。Neo4j的使用案例涵蓋了包括網(wǎng)絡(luò)管理、軟件分析、科學(xué)研究、路由分析、組織和項(xiàng)目管理、決策制定、社交網(wǎng)絡(luò)等。
官方網(wǎng)站:https://neo4j.com
Github: https://github.com/neo4j/neo4j
Example: https://github.com/neo4j-examples
Neo4j的特點(diǎn)
- SQL一樣容易查詢語言的Neo4j CQL。
- 它遵循屬性圖數(shù)據(jù)模型。
- 它通過使用Apache Lucence支持索引。
- 它支持UNIQUE約束。
- 它包含一個(gè)UI執(zhí)行CQL指令:Neo4j的數(shù)據(jù)瀏覽器。
- 它支持完整的ACID(原子性,一致性,隔離性和持久性)規(guī)則。
- 它采用原生圖形庫與本地GPE(圖形處理引擎)。
- 它支持查詢的數(shù)據(jù)導(dǎo)出到JSON和XLS格式。
- 它提供了REST API由如Java,python等編程語言進(jìn)行訪問。
- 它提供了Java Script支持以任何UI MVC框架如Node JS進(jìn)行訪問。
- 它支持兩種類型的Java API:Cypher支架API和本地Java API來開發(fā)Java應(yīng)用程序。
Neo4j優(yōu)勢(shì)
? neo4j不管是與關(guān)系型數(shù)據(jù)庫相比,還是與其他NoSQL數(shù)據(jù)庫相比,都具有很多前所未有的優(yōu)勢(shì),這可以從以下幾個(gè)方面來分析,主要表現(xiàn)為查詢的高性能、設(shè)計(jì)的靈活性和開發(fā)的敏捷性等。<本段內(nèi)容選自<Neo4j全棧開發(fā)>>
1 高性能表現(xiàn)
Neo4j是一個(gè)原生的圖數(shù)據(jù)庫引擎,它存儲(chǔ)了原生的圖數(shù)據(jù),因此,可以使用圖結(jié)構(gòu)的自然伸展特性來設(shè)計(jì)免索引鄰近節(jié)點(diǎn)遍歷的查詢算法,即圖的遍歷算法設(shè)計(jì)。圖的遍歷是圖數(shù)據(jù)結(jié)構(gòu)所具有的獨(dú)特算法,即從一個(gè)節(jié)點(diǎn)開始,根據(jù)其連接的關(guān)系,可以快速和方便地找出它的鄰近節(jié)點(diǎn)。這種查找數(shù)據(jù)的方法并不受數(shù)據(jù)量的大小所影響,因?yàn)猷徑樵兪冀K查找的是有限的局部數(shù)據(jù),不會(huì)對(duì)整個(gè)數(shù)據(jù)庫進(jìn)行搜索。所以,Neo4j具有非常高效的查詢性能,相比于RDBMS可以提高數(shù)倍乃至數(shù)十倍的查詢速度。而且查詢速度不會(huì)因數(shù)據(jù)量的增長(zhǎng)而下降,即數(shù)據(jù)庫可以經(jīng)久耐用,并且始終保持最初的活力。不像RDBMS那樣,因?yàn)椴豢杀苊獾厥褂昧艘恍┓妒皆O(shè)計(jì),所以在查詢時(shí)如果需要表示一些復(fù)雜的關(guān)系,勢(shì)必會(huì)構(gòu)造很多連接,從而形成很多復(fù)雜的運(yùn)算。并且在查詢中更加可怕的是還會(huì)涉及大量數(shù)據(jù),這些數(shù)據(jù)大多數(shù)與結(jié)果毫無關(guān)系,有的可能僅僅是通過ID查找它的名稱而已,所以隨著數(shù)據(jù)量的增長(zhǎng),即使查詢一小部分?jǐn)?shù)據(jù),查詢也會(huì)變得越來越慢,性能日趨下降,以至于讓人無法忍受。
2 設(shè)計(jì)的靈活性
在日新月異的互聯(lián)網(wǎng)應(yīng)用中,業(yè)務(wù)需求會(huì)隨著時(shí)間和條件的改變而發(fā)生變化,這對(duì)于以往使用結(jié)構(gòu)化數(shù)據(jù)的系統(tǒng)來說,往往很難適應(yīng)這種變化的需要。圖數(shù)據(jù)結(jié)構(gòu)的自然伸展特性及其非結(jié)構(gòu)化的數(shù)據(jù)格式,讓Neo4j的數(shù)據(jù)庫設(shè)計(jì)可以具有很大的伸縮性和靈活性。因?yàn)殡S著需求的變化而增加的節(jié)點(diǎn)、關(guān)系及其屬性并不會(huì)影響到原來數(shù)據(jù)的正常使用,所以使用Neo4j來設(shè)計(jì)數(shù)據(jù)庫,可以更接近業(yè)務(wù)需求的變化,可以更快地趕上需求發(fā)展變化的腳步。
大多數(shù)使用關(guān)系型數(shù)據(jù)庫的系統(tǒng),為了應(yīng)對(duì)快速變化的業(yè)務(wù)需求,往往需要采取推倒重來的方法重構(gòu)整個(gè)應(yīng)用系統(tǒng)。而這樣做的成本是巨大的。使用Neo4j可以最大限度地避免這種情況發(fā)生。雖然有時(shí)候,也許是因?yàn)樽畛醯脑O(shè)計(jì)考慮得太不周全,或者為了獲得更好的表現(xiàn)力,數(shù)據(jù)庫變更和遷移在所難免,但是使用Neo4j來做這項(xiàng)工作也是非常容易的,至少它沒有模式結(jié)構(gòu)定義方面的苦惱。
3 開發(fā)的敏捷性
圖數(shù)據(jù)庫設(shè)計(jì)中直觀明了的數(shù)據(jù)模型,從需求的討論開始,到程序開發(fā)和實(shí)現(xiàn),以及最終保存在數(shù)據(jù)庫中的樣子,它的模樣似乎沒有什么變化,甚至可以說本來就是一模一樣的。這說明,業(yè)務(wù)需求與系統(tǒng)設(shè)計(jì)之間可以拉近距離,需求和實(shí)現(xiàn)結(jié)果之間越來越接近。這不但降低了業(yè)務(wù)人員與設(shè)計(jì)人員之間的溝通成本,也使得開發(fā)更加容易迭代,并且非常適合使用敏捷開發(fā)方法。
Neo4j本身可伸縮的設(shè)計(jì)靈活性,以及直觀明了的數(shù)據(jù)模型設(shè)計(jì),還有其自身簡(jiǎn)單易用的特點(diǎn)等,所有這些優(yōu)勢(shì)充分說明,使用Neo4j很適合以一種測(cè)試驅(qū)動(dòng)的方法應(yīng)用于系統(tǒng)設(shè)計(jì)和開發(fā)自始至終的過程之中,通過迭代來加深對(duì)需求的理解,并通過迭代來完善數(shù)據(jù)模型設(shè)計(jì)。
4 與其他數(shù)據(jù)庫的比較
與當(dāng)前一些主流的數(shù)據(jù)庫相比,不管是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,還是NoSQL數(shù)據(jù)庫,或者同類的圖數(shù)據(jù)庫,Neo4j都是出類拔萃的。
在傳統(tǒng)的RDBMS中,如果要表現(xiàn)一個(gè)部門的用戶,即1.2節(jié)提到的例子,按照第三范式的設(shè)計(jì)要求,至少需要三張表格來表示,即部門表、用戶表和部門-用戶關(guān)系表,這樣實(shí)體和關(guān)系就被人為地隔開了,它們是完全分離的,存在于不同的表中,這就給查詢帶來了一定的難度,從而影響了查詢的性能。而Neo4j所表現(xiàn)的是實(shí)體的聯(lián)系本身,它表現(xiàn)了現(xiàn)實(shí)世界中事物聯(lián)系的本質(zhì),它的聯(lián)系在節(jié)點(diǎn)創(chuàng)建時(shí)就已經(jīng)建立,所以在查詢中能以快捷的路徑返回關(guān)聯(lián)數(shù)據(jù),從而表現(xiàn)出非常高效的查詢性能。
Key-Value的數(shù)據(jù)庫雖然能提供高性能的查詢,但它所能表示的內(nèi)容是有限的。實(shí)際上,Neo4j節(jié)點(diǎn)的屬性就是一些Key-Value的數(shù)據(jù)集合。而Neo4j通過節(jié)點(diǎn)和關(guān)系的屬性可以表現(xiàn)更為豐富多彩的內(nèi)容,這是其他Key-Value的數(shù)據(jù)庫所無法比擬的。
對(duì)于Key-Document文檔數(shù)據(jù)庫來說,相對(duì)于Key-Value數(shù)據(jù)庫,內(nèi)容是豐富了些,但美中不足的是,一個(gè)文檔經(jīng)不起內(nèi)容的變更或修改。如果用Neo4j的節(jié)點(diǎn)及其屬性來表示,則處理這種類似的變更卻是輕而易舉的。
在圖數(shù)據(jù)庫領(lǐng)域,除Neo4j之外,還有其他如OrientDB、Giraph、AllegroGraph等各種圖數(shù)據(jù)庫。跟所有這些圖數(shù)據(jù)庫相比,Neo4j的優(yōu)勢(shì)表現(xiàn)在以下兩個(gè)方面。
?。?)Neo4j是一個(gè)原生圖計(jì)算引擎,它存儲(chǔ)和使用的數(shù)據(jù)自始至終都是使用原生的圖結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理的,不像有些圖數(shù)據(jù)庫,只是在計(jì)算處理時(shí)使用了圖結(jié)構(gòu)數(shù)據(jù),而在存儲(chǔ)時(shí)還將數(shù)據(jù)保存在關(guān)系型數(shù)據(jù)庫中。
?。?)Neo4j是一個(gè)開源的數(shù)據(jù)庫,其開源的社區(qū)版吸引了眾多第三方的使用和推廣,如開源項(xiàng)目Spring Data Neo4j就是一個(gè)做得很不錯(cuò)的例子,同時(shí)也得到了更多開發(fā)者的擁躉和支持,聚集了豐富的可供交流和學(xué)習(xí)的資源與案例。這些支持、推廣和大量的使用,反過來會(huì)很好地推動(dòng)Neo4j的發(fā)展。
5 綜合表現(xiàn)
Neo4j查詢的高性能表現(xiàn)、易于使用的特性及其設(shè)計(jì)的靈活性和開發(fā)的敏捷性,以及堅(jiān)如磐石般的事務(wù)管理特性等特點(diǎn),都充分說明了使用Neo4j是一個(gè)不錯(cuò)的選擇。有關(guān)它的所有優(yōu)點(diǎn),總結(jié)起來,主要表現(xiàn)在以下幾個(gè)方面。
?。?)閃電般的讀/寫速度,無與倫比的高性能表現(xiàn)。
?。?)非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方式,在數(shù)據(jù)庫設(shè)計(jì)上具有很大的靈活性。
(3)能很好地適應(yīng)需求變化,并適合使用敏捷開發(fā)方法。
?。?)很容易使用,可以用嵌入式、服務(wù)器模式、分布式模式等方式來使用數(shù)據(jù)庫。
?。?)使用簡(jiǎn)單框圖就可以設(shè)計(jì)數(shù)據(jù)模型,方便建模。
?。?)圖數(shù)據(jù)的結(jié)構(gòu)特點(diǎn)可以提供更多更優(yōu)秀的算法設(shè)計(jì)。
?。?)完全支持ACID完整的事務(wù)管理特性。
?。?)提供分布式高可用模式,可以支持大規(guī)模的數(shù)據(jù)增長(zhǎng)。
?。?)數(shù)據(jù)庫安全可靠,可以實(shí)時(shí)備份數(shù)據(jù),很方便恢復(fù)數(shù)據(jù)。
?。?0)圖的數(shù)據(jù)結(jié)構(gòu)直觀而形象地表現(xiàn)了現(xiàn)實(shí)世界的應(yīng)用場(chǎng)景。