Neo4j(一):图数据库基础
目錄
1、概述
1.1 特點
1.2 優點
1.3 缺點?
?1.4?Neo4j的使用場景
2、為什么需要圖數據庫
2.1 Google+
2.2?Facebook
3、數據模型
4、圖形理論基礎
5、 Neo4j體系結構
5.1 免索引鄰接
5.2?Neo4j遍歷方式
1、概述
????????Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。
1.1 特點
-
SQL就像簡單的查詢語言Neo4j CQL。
-
它遵循屬性圖數據模型。
-
它通過使用Apache Lucence支持索引。
-
它支持UNIQUE約束。
-
它包含一個用于執行CQL命令的UI:Neo4j數據瀏覽器。
-
它支持完整的ACID(原子性,一致性,隔離性和持久性)規則。
-
它采用原生圖形庫與本地GPE(圖形處理引擎)。
-
它支持查詢的數據導出到JSON和XLS格式。
-
它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問。
-
它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本。
-
它支持兩種Java API:Cypher API和Native Java API來開發Java應用程序。
1.2 優點
-
數據底層存儲專門針對圖數據的特點進行優化,在關系數據的處理上具備遠高于其他數據庫的性能。
-
檢索/遍歷/導航更多的連接數據是非常容易和快速的。
-
專門為關系數據設計的查詢語言,對于關系數據的操作更加的方便。
-
Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習。
-
自動為數據建立合適的索引(根據數據的標簽),免去管理索引的麻煩。
-
支持高可用性主從集群部署。
-
它不需要復雜的連接來檢索連接的/相關的數據,因為它很容易檢索它的相鄰節點或關系細節沒有連接或索引。
-
具備圖形化平臺等配套工具,幫助開發者快速構建出完整的關系數據平臺。
1.3 缺點?
-
Neo4j來處理結點本身的屬性就沒有什么優勢。
-
單機版,分布式不好做。
?1.4?Neo4j的使用場景
-
社交網絡:根據用戶與其他用戶的關系為用戶推薦新的朋友。例如,在QQ中給你推薦朋友的朋友 。
-
智能推薦引擎:通過分析用戶有哪些朋友、用戶朋友喜好的產品、用戶的瀏覽記錄等關系信息為用戶推薦商品。
-
知識圖譜:根據知識點之間的關系建立知識圖,幫助用戶搜索到關聯的知識。
-
網絡、數據中心管理:網絡、數據中心這些基礎設施自身就是一個包含復雜關系的網絡,利用Neo4j可以方便的建立設備之間的關系,以便于對整個系統的管理。
2、為什么需要圖數據庫
????????隨著技術的發展,我們對數據的需求已經不再局限于對數據本身的獲取了,我們還需要獲取數據與數據間的關系(也就是連接數據)。簡單地說,我們可以說圖數據庫主要用于存儲更多的連接數據(因為圖結構相比其他數據結構而言,能保存更多的數據間的關系)。
????????如果我們使用 RDBMS 數據庫來存儲更多連接的數據,那么它們不能提供用于遍歷大量數據的適當性能。 在這些情況下,Graph Database 提高了應用程序性能。
????????我們將觀察什么是連接數據? 以及這些應用程序如何與某些實時應用程序存儲數據。
2.1 Google+
使用 Google+(GooglePlus)應用程序來了解現實世界中 Graph 數據庫的需求。 觀察下面的圖表。在這里,我們用圓圈表示了 Google+應用個人資料。
在上圖中,輪廓“A”具有圓圈以連接到其他輪廓:家庭圈(B,C,D)和朋友圈(B,C)。
再次,如果我們打開配置文件“B”,我們可以觀察以下連接的數據。
????????像這樣,這些應用程序包含大量的結構化,半結構化和非結構化的連接數據。 在 RDBMS 數據庫中表示這種非結構化連接數據并不容易。如果我們在 RDBMS 數據庫中存儲這種更多連接的數據,那么檢索或遍歷是非常困難和緩慢的。所以要表示或存儲這種更連接的數據,我們應該選擇一個流行的圖數據庫。
????????圖形DBMS非常容易地存儲這種更多連接的數據。 它將每個配置文件數據作為節點存儲在內部,它與相鄰節點連接的節點,它們通過關系相互連接。他們存儲這種連接的數據與上面的圖表中的相同,這樣檢索或遍歷是非常容易和更快的。
2.2?Facebook
利用 Facebook 應用程序了解現實世界中 Graph 數據庫的需求。
????????在上面的圖中,Facebook Profile“A”已經連接到他的朋友,喜歡他的一些朋友,發送消息給他的一些朋友,跟隨他喜歡的一些名人。?這意味著大量的連接數據配置文件A.如果我們打開其他配置文件,如配置文件B,我們將看到類似的大量的連接數據。
注:通過觀察上述兩個應用程序,他們有更多的連接數據。使用圖形數據庫存儲和檢索這種更連接的數據是非常容易的。
3、數據模型
Neo4j圖數據庫遵循屬性圖模型來存儲和管理其數據。
屬性圖模型規則
-
表示節點,關系和屬性中的數據
-
節點和關系都包含屬性
-
關系連接節點
-
屬性是鍵值對
-
節點用圓圈表示,關系用方向鍵表示。
-
關系具有方向:單向和雙向。
-
每個關系包含“開始節點”或“從節點”和“到節點”或“結束節點”
?????????在屬性圖數據模型中,關系應該是定向的。如果我們嘗試創建沒有方向的關系,那么它將拋出一個錯誤消息。在Neo4j中,關系也應該是有方向性的。如果我們嘗試創建沒有方向的關系,那么Neo4j會拋出一個錯誤消息,“關系應該是方向性的”。Neo4j圖數據庫將其所有數據存儲在節點和關系中。我們不需要任何額外的RDBMS數據庫或無SQL數據庫來存儲Neo4j數據庫數據。它以圖形的形式存儲其數據的本機格式。Neo4j使用本機GPE(圖形處理引擎)引擎來使用它的本機圖存儲格式。
圖形數據庫數據模型的主要構建塊是:
-
節點
-
關系
-
屬性
簡單的屬性圖的例子
????????這里我們使用圓圈表示節點。 使用箭頭的關系。 關系是有方向性的。 我們可以用Properties(鍵值對)來表示Node的數據。 在這個例子中,我們在Node的Circle中表示了每個Node的Id屬性。
4、圖形理論基礎
????????圖是一組節點和連接這些節點的關系。圖形數據存儲在節點和關系在屬性的形式。屬性是鍵值對表示數據。圖形以屬性的形式將數據存儲在節點和關系中,屬性是用于表示數據的鍵值對。在圖形理論中,我們可以表示一個帶有圓的節點,節點之間的關系用一個箭頭標記表示。
最簡單的可能圖是單個節點:
我們可以使用節點表示社交網絡(如Google+(GooglePlus)個人資料)。 它不包含任何屬性。?
向 Google+個人資料添加一些屬性:
?此節點包含一組屬性。 屬性是一個名稱:鍵值對。
在兩個節點之間創建關系
?此處在兩個配置文件之間創建關系名稱“跟隨”。 這意味著 Profile-I 遵循 Profile-II。
復雜的示例圖
?這里節點用關系連接。 關系是單向或雙向的。
- 從PQR到XYZ的關系是單向關系。
- 從ABC到PQR的關系是雙向關系。
5、 Neo4j體系結構
5.1 免索引鄰接
Neo4j有一個重要的特點,就是用來保證關系查詢的速度,即免索引鄰接屬性,數據庫中的每個節點都會維護與它相鄰節點的引用。因此每個節點都相當于與它相鄰節點的微索引,這比使用全局索引的代價要小得多。這就意味著查詢時間和圖的整體規模無關,只與它附近節點的數量成正比。在關系型數據庫中使用全局索引連接各個節點,這些索引對每個遍歷都會增加一個中間層,因此會導致非常大的計算成本。而免索引鄰接為圖數據庫提供了快速、高效的圖遍歷能力。
對比下面兩圖,可以明顯的看出關系型數據庫與Neo4j在查找關系時的區別。
?
????????圖1-14展示了在RDBMS(關系型數據庫)中的查詢方式。要查找Alice所購買的定西,首先要執行關系表的索引查詢,時間成本為O(log(n)),n為索引表的長度。這對于偶爾的淺層次查詢時可以接受的,但是當查詢的層次變深或是執行反向查詢時代價將會變得不可接受了。如果相較于查詢Alice所購買的東西,要查詢某件商品被哪些人購買了(推薦引擎中常用的一個場景),將不得不使用暴力方法來便利整個索引,時間復雜度將增長到O(n)。除非我們再建立-個從商品到用戶的索引表,但是該方法將會占用許多額外的嘰井 且使索引變得難以維護。
????????如果我們再考慮-個更復雜的場景,Alice購買過的商品被哪些人購買過(推薦引擎中查找有共同愛好的人),找到Alice購買過的商品的時間成本為O(log(n)),找到每個商品被哪 些人購買的時間成本為O(n),假如Alice購買過m(m遠小于n)個商品,那么總的時間復雜 度即為O(mnlog(n))。即使再建立一個方向索引表,時間復雜度也為O(mn)。
????????圖1-15展示了在同樣的場景下Neo4j的查詢方式。使用免索引近鄰機制,每個節點都有 直接或間接指向其相鄰節點的指針。要查找Alice買過的東西,只需要在Alice的關系鏈表中 遍歷,每次的遍歷成本僅為O(1)。要查找一個商品被哪些人購買了,只要跟隨指向該商品的 關系來源即可,每次的遍歷成本也是O(1)。更復雜的,要查找Alice購買過的東西被哪些人 購買過,時間復雜度也僅為O(m),其中m遠小于n。這相較于RDBMS的時間復雜度還是占 有絕對的優勢。
免索引鄰接針對RDBMS中的關系查詢的兩個缺點做了改進:
????????(1)先索引鄰接使用遍歷物理美系的方法查找,比起全局索引來說代價要小得多。查詢一個索引一般的時間復雜度為O(log(n)),而遍歷物理關系的時間復雜度僅為O(1),至少對于 Neo4j的存儲結構來說是如此。
????????(2)當索引建立之后在試圖反向遍歷時,建立的索引就起不到作用了。我們有兩個選 擇:對每個反向遍歷的場景創建反向查找索引,或者使用原索引進行暴力搜索,而暴力搜索 的時間復雜度為O(n)。這種代價相對于很多需要實時操作的場景來說是不可接受的。
????????利用兔索引鄰接機制,在圖數據庫上進行關系查詢效率非常高,這種高效是建立在圖數 據庫注重關系的架構設計之上的。
5.2?Neo4j遍歷方式
-
對于1-21圖中的箭頭導向就是指針.每個節點的所有指針組成了每個節點的雙向關系鏈條
-
對于 1-21 圖中的 R1 R2 R3 這些都是關系.
-
當你想要遍歷一個節點的所有關系,通過雙向鏈條的指針我們可以很容易遍歷每個節點的所有關系
遍歷規則:
遍歷的時候從第一個next沒有上一個箭頭的關系開始正向遍歷.或prev指向null的關系開始反向遍歷
示例:
比如A.第一個關系是R1(AB),第二個關系是R2(AC).
同理遍歷B.第一個關系R1(BA),第二個R3(BD) 第三個R4(BE) 第四個R5(BC) -
圖1-20中的p1~p10可以理解為屬性(單向鏈表,遍歷屬性的時候只能從頭開始遍歷到最后).屬性值如果大小很小,就直接存放在屬性存儲文件里面,如果過大,申請動態存儲,將對應動態存儲文件里面的地址存放到屬性里面。
總結
以上是生活随笔為你收集整理的Neo4j(一):图数据库基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机串口接收数据的一些经验与教训
- 下一篇: 基于51单片机的水流量传感器测试系统