日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Neo4j(一):图数据库基础

發(fā)布時間:2023/12/31 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Neo4j(一):图数据库基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1、概述

1.1 特點

1.2 優(yōu)點

1.3 缺點?

?1.4?Neo4j的使用場景

2、為什么需要圖數(shù)據(jù)庫

2.1 Google+

2.2?Facebook

3、數(shù)據(jù)模型

4、圖形理論基礎

5、 Neo4j體系結構

5.1 免索引鄰接

5.2?Neo4j遍歷方式


1、概述

????????Neo4j是一個高性能的,NOSQL圖形數(shù)據(jù)庫,它將結構化數(shù)據(jù)存儲在網(wǎng)絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數(shù)據(jù)存儲在網(wǎng)絡(從數(shù)學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。程序員工作在一個面向?qū)ο蟮摹㈧`活的網(wǎng)絡結構下而不是嚴格、靜態(tài)的表中——但是他們可以享受到具備完全的事務特性、企業(yè)級的數(shù)據(jù)庫的所有好處。

1.1 特點

  • SQL就像簡單的查詢語言Neo4j CQL。

  • 它遵循屬性圖數(shù)據(jù)模型。

  • 它通過使用Apache Lucence支持索引。

  • 它支持UNIQUE約束。

  • 它包含一個用于執(zhí)行CQL命令的UI:Neo4j數(shù)據(jù)瀏覽器。

  • 它支持完整的ACID(原子性,一致性,隔離性和持久性)規(guī)則。

  • 它采用原生圖形庫與本地GPE(圖形處理引擎)。

  • 它支持查詢的數(shù)據(jù)導出到JSON和XLS格式。

  • 它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問。

  • 它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本。

  • 它支持兩種Java API:Cypher API和Native Java API來開發(fā)Java應用程序。

1.2 優(yōu)點

  • 數(shù)據(jù)底層存儲專門針對圖數(shù)據(jù)的特點進行優(yōu)化,在關系數(shù)據(jù)的處理上具備遠高于其他數(shù)據(jù)庫的性能。

  • 檢索/遍歷/導航更多的連接數(shù)據(jù)是非常容易和快速的。

  • 專門為關系數(shù)據(jù)設計的查詢語言,對于關系數(shù)據(jù)的操作更加的方便。

  • Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習。

  • 自動為數(shù)據(jù)建立合適的索引(根據(jù)數(shù)據(jù)的標簽),免去管理索引的麻煩。

  • 支持高可用性主從集群部署。

  • 它不需要復雜的連接來檢索連接的/相關的數(shù)據(jù),因為它很容易檢索它的相鄰節(jié)點或關系細節(jié)沒有連接或索引。

  • 具備圖形化平臺等配套工具,幫助開發(fā)者快速構建出完整的關系數(shù)據(jù)平臺。

1.3 缺點?

  • Neo4j來處理結點本身的屬性就沒有什么優(yōu)勢。

  • 單機版,分布式不好做。

?1.4?Neo4j的使用場景

  • 社交網(wǎng)絡:根據(jù)用戶與其他用戶的關系為用戶推薦新的朋友。例如,在QQ中給你推薦朋友的朋友 。

  • 智能推薦引擎:通過分析用戶有哪些朋友、用戶朋友喜好的產(chǎn)品、用戶的瀏覽記錄等關系信息為用戶推薦商品。

  • 知識圖譜:根據(jù)知識點之間的關系建立知識圖,幫助用戶搜索到關聯(lián)的知識。

  • 網(wǎng)絡、數(shù)據(jù)中心管理:網(wǎng)絡、數(shù)據(jù)中心這些基礎設施自身就是一個包含復雜關系的網(wǎng)絡,利用Neo4j可以方便的建立設備之間的關系,以便于對整個系統(tǒng)的管理。

2、為什么需要圖數(shù)據(jù)庫

????????隨著技術的發(fā)展,我們對數(shù)據(jù)的需求已經(jīng)不再局限于對數(shù)據(jù)本身的獲取了,我們還需要獲取數(shù)據(jù)與數(shù)據(jù)間的關系(也就是連接數(shù)據(jù))。簡單地說,我們可以說圖數(shù)據(jù)庫主要用于存儲更多的連接數(shù)據(jù)(因為圖結構相比其他數(shù)據(jù)結構而言,能保存更多的數(shù)據(jù)間的關系)。

????????如果我們使用 RDBMS 數(shù)據(jù)庫來存儲更多連接的數(shù)據(jù),那么它們不能提供用于遍歷大量數(shù)據(jù)的適當性能。 在這些情況下,Graph Database 提高了應用程序性能。

????????我們將觀察什么是連接數(shù)據(jù)? 以及這些應用程序如何與某些實時應用程序存儲數(shù)據(jù)。

2.1 Google+

使用 Google+(GooglePlus)應用程序來了解現(xiàn)實世界中 Graph 數(shù)據(jù)庫的需求。 觀察下面的圖表。在這里,我們用圓圈表示了 Google+應用個人資料。

在上圖中,輪廓“A”具有圓圈以連接到其他輪廓:家庭圈(B,C,D)和朋友圈(B,C)。

再次,如果我們打開配置文件“B”,我們可以觀察以下連接的數(shù)據(jù)。

????????像這樣,這些應用程序包含大量的結構化,半結構化和非結構化的連接數(shù)據(jù)。 在 RDBMS 數(shù)據(jù)庫中表示這種非結構化連接數(shù)據(jù)并不容易。如果我們在 RDBMS 數(shù)據(jù)庫中存儲這種更多連接的數(shù)據(jù),那么檢索或遍歷是非常困難和緩慢的。所以要表示或存儲這種更連接的數(shù)據(jù),我們應該選擇一個流行的圖數(shù)據(jù)庫。

????????圖形DBMS非常容易地存儲這種更多連接的數(shù)據(jù)。 它將每個配置文件數(shù)據(jù)作為節(jié)點存儲在內(nèi)部,它與相鄰節(jié)點連接的節(jié)點,它們通過關系相互連接。他們存儲這種連接的數(shù)據(jù)與上面的圖表中的相同,這樣檢索或遍歷是非常容易和更快的。

2.2?Facebook

利用 Facebook 應用程序了解現(xiàn)實世界中 Graph 數(shù)據(jù)庫的需求。

????????在上面的圖中,Facebook Profile“A”已經(jīng)連接到他的朋友,喜歡他的一些朋友,發(fā)送消息給他的一些朋友,跟隨他喜歡的一些名人。?這意味著大量的連接數(shù)據(jù)配置文件A.如果我們打開其他配置文件,如配置文件B,我們將看到類似的大量的連接數(shù)據(jù)。

注:通過觀察上述兩個應用程序,他們有更多的連接數(shù)據(jù)。使用圖形數(shù)據(jù)庫存儲和檢索這種更連接的數(shù)據(jù)是非常容易的。

3、數(shù)據(jù)模型

Neo4j圖數(shù)據(jù)庫遵循屬性圖模型來存儲和管理其數(shù)據(jù)。

屬性圖模型規(guī)則

  • 表示節(jié)點,關系和屬性中的數(shù)據(jù)

  • 節(jié)點和關系都包含屬性

  • 關系連接節(jié)點

  • 屬性是鍵值對

  • 節(jié)點用圓圈表示,關系用方向鍵表示。

  • 關系具有方向:單向和雙向。

  • 每個關系包含“開始節(jié)點”或“從節(jié)點”和“到節(jié)點”或“結束節(jié)點”

?????????在屬性圖數(shù)據(jù)模型中,關系應該是定向的。如果我們嘗試創(chuàng)建沒有方向的關系,那么它將拋出一個錯誤消息。在Neo4j中,關系也應該是有方向性的。如果我們嘗試創(chuàng)建沒有方向的關系,那么Neo4j會拋出一個錯誤消息,“關系應該是方向性的”。Neo4j圖數(shù)據(jù)庫將其所有數(shù)據(jù)存儲在節(jié)點和關系中。我們不需要任何額外的RDBMS數(shù)據(jù)庫或無SQL數(shù)據(jù)庫來存儲Neo4j數(shù)據(jù)庫數(shù)據(jù)。它以圖形的形式存儲其數(shù)據(jù)的本機格式。Neo4j使用本機GPE(圖形處理引擎)引擎來使用它的本機圖存儲格式。

圖形數(shù)據(jù)庫數(shù)據(jù)模型的主要構建塊是:

  • 節(jié)點

  • 關系

  • 屬性

簡單的屬性圖的例子

????????這里我們使用圓圈表示節(jié)點。 使用箭頭的關系。 關系是有方向性的。 我們可以用Properties(鍵值對)來表示Node的數(shù)據(jù)。 在這個例子中,我們在Node的Circle中表示了每個Node的Id屬性。

4、圖形理論基礎

????????圖是一組節(jié)點和連接這些節(jié)點的關系。圖形數(shù)據(jù)存儲在節(jié)點和關系在屬性的形式。屬性是鍵值對表示數(shù)據(jù)。圖形以屬性的形式將數(shù)據(jù)存儲在節(jié)點和關系中,屬性是用于表示數(shù)據(jù)的鍵值對。在圖形理論中,我們可以表示一個帶有圓的節(jié)點,節(jié)點之間的關系用一個箭頭標記表示。

最簡單的可能圖是單個節(jié)點:

我們可以使用節(jié)點表示社交網(wǎng)絡(如Google+(GooglePlus)個人資料)。 它不包含任何屬性。?

向 Google+個人資料添加一些屬性:

?此節(jié)點包含一組屬性。 屬性是一個名稱:鍵值對。

在兩個節(jié)點之間創(chuàng)建關系

?此處在兩個配置文件之間創(chuàng)建關系名稱“跟隨”。 這意味著 Profile-I 遵循 Profile-II。

復雜的示例圖

?這里節(jié)點用關系連接。 關系是單向或雙向的。

  • 從PQR到XYZ的關系是單向關系。
  • 從ABC到PQR的關系是雙向關系。

5、 Neo4j體系結構

5.1 免索引鄰接

Neo4j有一個重要的特點,就是用來保證關系查詢的速度,即免索引鄰接屬性,數(shù)據(jù)庫中的每個節(jié)點都會維護與它相鄰節(jié)點的引用。因此每個節(jié)點都相當于與它相鄰節(jié)點的微索引,這比使用全局索引的代價要小得多。這就意味著查詢時間和圖的整體規(guī)模無關,只與它附近節(jié)點的數(shù)量成正比。在關系型數(shù)據(jù)庫中使用全局索引連接各個節(jié)點,這些索引對每個遍歷都會增加一個中間層,因此會導致非常大的計算成本。而免索引鄰接為圖數(shù)據(jù)庫提供了快速、高效的圖遍歷能力。

對比下面兩圖,可以明顯的看出關系型數(shù)據(jù)庫與Neo4j在查找關系時的區(qū)別。

?

????????圖1-14展示了在RDBMS(關系型數(shù)據(jù)庫)中的查詢方式。要查找Alice所購買的定西,首先要執(zhí)行關系表的索引查詢,時間成本為O(log(n)),n為索引表的長度。這對于偶爾的淺層次查詢時可以接受的,但是當查詢的層次變深或是執(zhí)行反向查詢時代價將會變得不可接受了。如果相較于查詢Alice所購買的東西,要查詢某件商品被哪些人購買了(推薦引擎中常用的一個場景),將不得不使用暴力方法來便利整個索引,時間復雜度將增長到O(n)。除非我們再建立-個從商品到用戶的索引表,但是該方法將會占用許多額外的嘰井 且使索引變得難以維護。

????????如果我們再考慮-個更復雜的場景,Alice購買過的商品被哪些人購買過(推薦引擎中查找有共同愛好的人),找到Alice購買過的商品的時間成本為O(log(n)),找到每個商品被哪 些人購買的時間成本為O(n),假如Alice購買過m(m遠小于n)個商品,那么總的時間復雜 度即為O(mnlog(n))。即使再建立一個方向索引表,時間復雜度也為O(mn)。

????????圖1-15展示了在同樣的場景下Neo4j的查詢方式。使用免索引近鄰機制,每個節(jié)點都有 直接或間接指向其相鄰節(jié)點的指針。要查找Alice買過的東西,只需要在Alice的關系鏈表中 遍歷,每次的遍歷成本僅為O(1)。要查找一個商品被哪些人購買了,只要跟隨指向該商品的 關系來源即可,每次的遍歷成本也是O(1)。更復雜的,要查找Alice購買過的東西被哪些人 購買過,時間復雜度也僅為O(m),其中m遠小于n。這相較于RDBMS的時間復雜度還是占 有絕對的優(yōu)勢。

免索引鄰接針對RDBMS中的關系查詢的兩個缺點做了改進:
????????(1)先索引鄰接使用遍歷物理美系的方法查找,比起全局索引來說代價要小得多。查詢一個索引一般的時間復雜度為O(log(n)),而遍歷物理關系的時間復雜度僅為O(1),至少對于 Neo4j的存儲結構來說是如此。
????????(2)當索引建立之后在試圖反向遍歷時,建立的索引就起不到作用了。我們有兩個選 擇:對每個反向遍歷的場景創(chuàng)建反向查找索引,或者使用原索引進行暴力搜索,而暴力搜索 的時間復雜度為O(n)。這種代價相對于很多需要實時操作的場景來說是不可接受的。

????????利用兔索引鄰接機制,在圖數(shù)據(jù)庫上進行關系查詢效率非常高,這種高效是建立在圖數(shù) 據(jù)庫注重關系的架構設計之上的。

5.2?Neo4j遍歷方式

  • 對于1-21圖中的箭頭導向就是指針.每個節(jié)點的所有指針組成了每個節(jié)點的雙向關系鏈條

  • 對于 1-21 圖中的 R1 R2 R3 這些都是關系.

  • 當你想要遍歷一個節(jié)點的所有關系,通過雙向鏈條的指針我們可以很容易遍歷每個節(jié)點的所有關系
    遍歷規(guī)則:
    遍歷的時候從第一個next沒有上一個箭頭的關系開始正向遍歷.或prev指向null的關系開始反向遍歷
    示例:
    比如A.第一個關系是R1(AB),第二個關系是R2(AC).
    同理遍歷B.第一個關系R1(BA),第二個R3(BD) 第三個R4(BE) 第四個R5(BC)

  • 圖1-20中的p1~p10可以理解為屬性(單向鏈表,遍歷屬性的時候只能從頭開始遍歷到最后).屬性值如果大小很小,就直接存放在屬性存儲文件里面,如果過大,申請動態(tài)存儲,將對應動態(tài)存儲文件里面的地址存放到屬性里面。

總結

以上是生活随笔為你收集整理的Neo4j(一):图数据库基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。