1.圖數(shù)據(jù)庫(kù)Neo4j介紹
1.1 什么是圖數(shù)據(jù)庫(kù)(graph database)
隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實(shí)社會(huì)織起了了一張龐大而復(fù)雜的關(guān)系網(wǎng),傳統(tǒng)數(shù)據(jù)庫(kù)很難處理關(guān)系運(yùn)算。大數(shù)據(jù)行業(yè)需要處理的數(shù)據(jù)之間的關(guān)系隨數(shù)據(jù)量呈幾何級(jí)數(shù)增長(zhǎng),急需一種支持海量復(fù)雜數(shù)據(jù)關(guān)系運(yùn)算的數(shù)據(jù)庫(kù),圖數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。
世界上很多著名的公司都在使用圖數(shù)據(jù)庫(kù),比如:
社交領(lǐng)域:Facebook, Twitter,Linkedin用它來(lái)管理社交關(guān)系,實(shí)現(xiàn)
好友推薦零售領(lǐng)域:eBay,沃爾瑪使用它實(shí)現(xiàn)商品實(shí)時(shí)推薦,給買(mǎi)家更好的購(gòu)物體驗(yàn)金融領(lǐng)域:摩根大通,花旗和瑞銀等銀行在用圖數(shù)據(jù)庫(kù)做風(fēng)控處理
汽車(chē)制造領(lǐng)域:沃爾沃,戴姆勒和豐田等頂級(jí)汽車(chē)制造商依靠圖數(shù)據(jù)庫(kù)推動(dòng)創(chuàng)新制造解決方案電信領(lǐng)域:Verizon, Orange和AT&T 等電信公司依靠圖數(shù)據(jù)庫(kù)來(lái)管理網(wǎng)絡(luò),控制訪問(wèn)并支持客戶(hù)
360
酒店領(lǐng)域:萬(wàn)豪和雅高酒店等頂級(jí)酒店公司依使用圖數(shù)據(jù)庫(kù)來(lái)管理復(fù)雜且快速變化的庫(kù)存圖數(shù)據(jù)庫(kù)并非指存儲(chǔ)圖片的數(shù)據(jù)庫(kù),而是以圖數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)和查詢(xún)數(shù)據(jù)。
圖數(shù)據(jù)庫(kù)是基于圖論實(shí)現(xiàn)的一種NoSQL數(shù)據(jù)庫(kù),其數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)查詢(xún)方式都是以圖論為基礎(chǔ)的,圖數(shù)據(jù)庫(kù)主要用于存儲(chǔ)更多的連接數(shù)據(jù)。
圖論〔Graph Theory〕是數(shù)學(xué)的一個(gè)分支。它以圖為研究對(duì)象圖論中的圖是由若干給定的點(diǎn)及連接兩點(diǎn)的線(xiàn)所構(gòu)成的圖形,這種圖形通常用來(lái)描述某些事物之間的某種特定關(guān)系,用點(diǎn)代表事物,用連接兩點(diǎn)的線(xiàn)表示相應(yīng)兩個(gè)事物間具有這種關(guān)系。
使用 Google+(GooglePlus)應(yīng)用程序來(lái)了解現(xiàn)實(shí)世界中 Graph 數(shù)據(jù)庫(kù)的需求。 觀察下面的圖表。
在這里,我們用圓圈表示了 Google+應(yīng)用個(gè)人資料。
在上圖中,輪廓“A”具有圓圈以連接到其他輪廓:家庭圈(B,C,D)和朋友圈(B,C)。
像這樣,這些應(yīng)用程序包含大量的結(jié)構(gòu)化,半結(jié)構(gòu)化和非結(jié)構(gòu)化的連接數(shù)據(jù)。 在 RDBMS 數(shù)據(jù)庫(kù)中表示這種非結(jié)構(gòu)化連接數(shù)據(jù)并不容易。如果我們?cè)?RDBMS 數(shù)據(jù)庫(kù)中存儲(chǔ)這種更多連接的數(shù)據(jù),那么檢索或遍歷是非常困難和緩慢的。所以要表示或存儲(chǔ)這種更連接的數(shù)據(jù),我們應(yīng)該選擇一個(gè)流行的圖數(shù)據(jù)庫(kù)。
圖數(shù)據(jù)庫(kù)非常容易地存儲(chǔ)這種更多連接的數(shù)據(jù)。 它將每個(gè)配置文件數(shù)據(jù)作為節(jié)點(diǎn)存儲(chǔ)在內(nèi)部,它與相鄰節(jié)點(diǎn)連接的節(jié)點(diǎn),它們通過(guò)關(guān)系相互連接。他們存儲(chǔ)這種連接的數(shù)據(jù)與上面的圖表中的相同,這樣檢索或遍歷是非常容易和更快的。
關(guān)系查詢(xún)性能對(duì)比 在數(shù)據(jù)關(guān)系中心,圖形數(shù)據(jù)庫(kù)在查詢(xún)速度方面非常高效,即使對(duì)于深度和復(fù)雜的查詢(xún)也是如此。在關(guān)系型數(shù)據(jù)庫(kù)和圖數(shù)據(jù)庫(kù)(Neo4j)之間進(jìn)行了實(shí)驗(yàn):在一個(gè)社交網(wǎng)絡(luò)里找到 大深度為5的朋友的朋友,他們的數(shù)據(jù)集包括100萬(wàn)人,每人約有50個(gè)朋友。
實(shí)驗(yàn)結(jié)果如下:
對(duì)比關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)(RDBMS) | 圖數(shù)據(jù)庫(kù) |
---|---|
表 | 圖 |
行 | 節(jié)點(diǎn) |
列和數(shù)據(jù) | 屬性和關(guān)系 |
約束 | 關(guān)系 |
在圖數(shù)據(jù)庫(kù)中,節(jié)點(diǎn)和關(guān)系取代表,外鍵和join:
1.2 什么是Neo4j
Neo4j是一個(gè)開(kāi)源的NoSQL圖形數(shù)據(jù)庫(kù),2003 年開(kāi)始開(kāi)發(fā),使用 scala和java 語(yǔ)言,2007年開(kāi)始發(fā)布。
是世界上 先進(jìn)的圖數(shù)據(jù)庫(kù)之一,提供原生的圖數(shù)據(jù)存儲(chǔ),檢索和處理;
采用屬性圖模型(Property graph model),極大的完善和豐富圖數(shù)據(jù)模型;專(zhuān)屬查詢(xún)語(yǔ)言 Cypher,直觀,高效;官網(wǎng): https://neo4j.com/
Neo4j的特性:
SQL就像簡(jiǎn)單的查詢(xún)語(yǔ)言Neo4j CQL 它遵循屬性圖數(shù)據(jù)模型
它通過(guò)使用Apache Lucence支持索引它支持UNIQUE約束
它包含一個(gè)用于執(zhí)行CQL命令的UI:Neo4j數(shù)據(jù)瀏覽器它支持完整的ACID(原子性,一致性,隔離性和持久性)規(guī)則它采用原生圖形庫(kù)與本地GPE(圖形處理引擎)
它支持查詢(xún)的數(shù)據(jù)導(dǎo)出到JSON和XLS格式它提供了REST API,可以被任何編程語(yǔ)言(如Java,Spring,Scala等)訪問(wèn)
它提供了可以通過(guò)任何UI MVC框架(如Node JS)訪問(wèn)的Java腳本
它支持兩種Java API:Cypher API和Native Java API來(lái)開(kāi)發(fā)Java應(yīng)用程序
Neo4j的優(yōu)點(diǎn):
它很容易表示連接的數(shù)據(jù)
使用簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)模型它不需要復(fù)雜的連接來(lái)檢索連接的/相關(guān)的數(shù)據(jù),因?yàn)樗苋菀讬z索它的相鄰節(jié)點(diǎn)或關(guān)系細(xì)節(jié)沒(méi)有連接或索引
1.3 Neo4j數(shù)據(jù)模型 圖論基礎(chǔ)
圖是一組節(jié)點(diǎn)和連接這些節(jié)點(diǎn)的關(guān)系,圖形以屬性的形式將數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)和關(guān)系中,屬性是用于表示數(shù)據(jù)的鍵值對(duì)。
在圖論中,我們可以表示一個(gè)帶有圓的節(jié)點(diǎn),節(jié)點(diǎn)之間的關(guān)系用一個(gè)箭頭標(biāo)記表示。
簡(jiǎn)單的可能圖是單個(gè)節(jié)點(diǎn):
我們可以使用節(jié)點(diǎn)表示社交網(wǎng)絡(luò)(如Google+(GooglePlus)個(gè)人資料),它不包含任何屬性。向
Google+個(gè)人資料添加一些屬性:
此處在兩個(gè)配置文件之間創(chuàng)建關(guān)系名稱(chēng)“跟隨”。 這意味著 Profile-I 遵循 Profile-II。
屬性圖模型
Neo4j圖數(shù)據(jù)庫(kù)遵循屬性圖模型來(lái)存儲(chǔ)和管理其數(shù)據(jù)。
屬性圖模型規(guī)則
表示節(jié)點(diǎn),關(guān)系和屬性中的數(shù)據(jù)節(jié)點(diǎn)
和關(guān)系都包含屬性關(guān)系連接節(jié)點(diǎn)屬性是鍵值對(duì)節(jié)點(diǎn)用圓圈表示,關(guān)系用方向鍵表示。
關(guān)系具有方向:?jiǎn)蜗蚝碗p向。
每個(gè)關(guān)系包含“開(kāi)始節(jié)點(diǎn)”或“從節(jié)點(diǎn)”和“到節(jié)點(diǎn)”或“結(jié)束節(jié)點(diǎn)” 在屬性圖數(shù)據(jù)模型中,關(guān)系應(yīng)該是定向的。如果我們嘗試創(chuàng)建沒(méi)有方向的關(guān)系,那么它將拋出一個(gè)錯(cuò)誤消息。在Neo4j中,關(guān)系也應(yīng)該是有方向性的。如果我們嘗試創(chuàng)建沒(méi)有方向的關(guān)系,那么Neo4j會(huì)拋出一個(gè)錯(cuò)誤消息,“關(guān)系應(yīng)該是方向性的”。
Neo4j圖數(shù)據(jù)庫(kù)將其所有數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)和關(guān)系中,我們不需要任何額外的RDBMS數(shù)據(jù)庫(kù)或NoSQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)Neo4j數(shù)據(jù)庫(kù)數(shù)據(jù),它以圖的形式存儲(chǔ)數(shù)據(jù)。Neo4j使用本機(jī)GPE(圖形處理引擎)來(lái)使用它的本機(jī)圖存儲(chǔ)格式。
圖數(shù)據(jù)庫(kù)數(shù)據(jù)模型的主要構(gòu)建塊是:
節(jié)點(diǎn)關(guān)系屬性
簡(jiǎn)單的屬性圖的例子:
這里我們使用圓圈表示節(jié)點(diǎn)。 使用箭頭表示關(guān)系,關(guān)系是有方向性的。 我們可以用Properties(鍵值對(duì))來(lái)表示Node的數(shù)據(jù)。 在這個(gè)例子中,我們?cè)贜ode的Circle中表示了每個(gè)Node的Id屬性。
1.4 Neo4j的構(gòu)建元素
Neo4j圖數(shù)據(jù)庫(kù)主要有以下構(gòu)建元素:
1、節(jié)點(diǎn)屬性
2、關(guān)系標(biāo)簽
3、數(shù)據(jù)瀏覽器
節(jié)點(diǎn)
節(jié)點(diǎn)(Node)是圖數(shù)據(jù)庫(kù)中的一個(gè)基本元素,用來(lái)表示一個(gè)實(shí)體記錄,就像關(guān)系數(shù)據(jù)庫(kù)中的一條記錄一樣。在Neo4j中節(jié)點(diǎn)可以包含多個(gè)屬性(Property)和多個(gè)標(biāo)簽(Label)。
1、節(jié)點(diǎn)是主要的數(shù)據(jù)元素節(jié)點(diǎn)通過(guò)關(guān)系連接到其他節(jié)點(diǎn)節(jié)點(diǎn)可以具有一個(gè)或多個(gè)屬性(即,存儲(chǔ)為鍵/值對(duì)的屬性)
2、節(jié)點(diǎn)有一個(gè)或多個(gè)標(biāo)簽,用于描述其在圖表中的作用
屬性
屬性(Property)是用于描述圖節(jié)點(diǎn)和關(guān)系的鍵值對(duì)。其中Key是一個(gè)字符串,值可以通過(guò)使用任何
Neo4j數(shù)據(jù)類(lèi)型來(lái)表示
1、屬性是命名值,其中名稱(chēng)(或鍵)是字符串屬性可以被索引和約束
2、可以從多個(gè)屬性創(chuàng)建復(fù)合索引
關(guān)系
關(guān)系(Relationship)同樣是圖數(shù)據(jù)庫(kù)的基本元素。當(dāng)數(shù)據(jù)庫(kù)中已經(jīng)存在節(jié)點(diǎn)后,需要將節(jié)點(diǎn)連接起來(lái)構(gòu)成圖。關(guān)系就是用來(lái)連接兩個(gè)節(jié)點(diǎn),關(guān)系也稱(chēng)為圖論的邊(Edge) ,其始端和末端都必須是節(jié)點(diǎn),關(guān)系不能指向空也不能從空發(fā)起。關(guān)系和節(jié)點(diǎn)一樣可以包含多個(gè)屬性,但關(guān)系只能有一個(gè)類(lèi)型(Type) 。
1、關(guān)系連接兩個(gè)節(jié)點(diǎn)關(guān)系是方向性的節(jié)點(diǎn)可以有多個(gè)甚至遞歸的關(guān)系
2、關(guān)系可以有一個(gè)或多個(gè)屬性(即存儲(chǔ)為鍵/值對(duì)的屬性)基于方向性,Neo4j關(guān)系被分為兩種主要類(lèi)型:
3、單向關(guān)系雙向關(guān)系
標(biāo)簽
標(biāo)簽(Label)將一個(gè)公共名稱(chēng)與一組節(jié)點(diǎn)或關(guān)系相關(guān)聯(lián), 節(jié)點(diǎn)或關(guān)系可以包含一個(gè)或多個(gè)標(biāo)簽。 我們可以為現(xiàn)有節(jié)點(diǎn)或關(guān)系創(chuàng)建新標(biāo)簽, 我們可以從現(xiàn)有節(jié)點(diǎn)或關(guān)系中刪除標(biāo)簽。
1、標(biāo)簽用于將節(jié)點(diǎn)分組一個(gè)節(jié)點(diǎn)可以具有多個(gè)標(biāo)簽對(duì)標(biāo)簽進(jìn)行索引2、以加速在圖中查找節(jié)點(diǎn)本機(jī)標(biāo)簽索引針對(duì)速度進(jìn)行了優(yōu)化
Neo4j Browser
3、一旦我們安裝Neo4j,我們就可以訪問(wèn)Neo4j數(shù)據(jù)瀏覽器
2. 環(huán)境搭建
下載地址:https://neo4j.com/download-center/
安裝方式:
1、Neo4j Enterprise Server
2、Neo4j Community Server
3、Neo4j Desktop
2.1 安裝Neo4j Community Server
注意: neo4j最新版對(duì)應(yīng)的java版本是jdk11
jdk8可以下載Neo4j Community Edition 3.5.28 文檔:
在瀏覽器中訪問(wèn)http://localhost:7474
使用用戶(hù)名neo4j和默認(rèn)密碼neo4j進(jìn)行連接,然后會(huì)提示更改密碼。
Neo4j Browser是開(kāi)發(fā)人員用來(lái)探索Neo4j數(shù)據(jù)庫(kù)、執(zhí)行Cypher查詢(xún)并以表格或圖形形式查看結(jié)果的工具。
2.2 docker 安裝Neo4j Community Server
7474 for HTTP.
7473 for HTTPS.
7687 for Bolt.
2.3 Neo4j Desktop安裝
下載安裝包默認(rèn)安裝
啟動(dòng)后可以選擇安裝本地neo4j數(shù)據(jù)庫(kù)或者連接遠(yuǎn)程neo4j數(shù)據(jù)庫(kù)。
3. Neo4j - CQL使用
3.1 Neo4j - CQL簡(jiǎn)介
Neo4j的Cypher語(yǔ)言是為處理圖形數(shù)據(jù)而構(gòu)建的,CQL代表Cypher查詢(xún)語(yǔ)言。像Oracle數(shù)據(jù)庫(kù)具有查詢(xún)語(yǔ)言SQL,Neo4j具有CQL作為查詢(xún)語(yǔ)言。
它是Neo4j圖形數(shù)據(jù)庫(kù)的查詢(xún)語(yǔ)言。
它是一種聲明性模式匹配語(yǔ)言
它遵循SQL語(yǔ)法。
它的語(yǔ)法是非常簡(jiǎn)單且人性化、可讀的格式。
三個(gè)共同朋友的社交圖:
create語(yǔ)句是創(chuàng)建模型語(yǔ)句用來(lái)創(chuàng)建數(shù)據(jù)模型
創(chuàng)建節(jié)點(diǎn)
創(chuàng)建關(guān)系
Neo4j圖數(shù)據(jù)庫(kù)遵循屬性圖模型來(lái)存儲(chǔ)和管理其數(shù)據(jù)。
根據(jù)屬性圖模型,關(guān)系應(yīng)該是定向的。 否則,Neo4j將拋出一個(gè)錯(cuò)誤消息。
基于方向性,Neo4j關(guān)系被分為兩種主要類(lèi)型。
MATCH查詢(xún)
Neo4j CQL MATCH命令用于
RETURN返回
Neo4j CQL RETURN子句用于
ORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對(duì)MATCH查詢(xún)返回的結(jié)果進(jìn)行排序。
我們可以按升序或降序?qū)π羞M(jìn)行排序。默認(rèn)情況下,它按升序?qū)π羞M(jìn)行排序。 如果我們要按降序?qū)λ鼈冞M(jìn)行排序,我們需要使用DESC子句。
NULL值
Neo4j CQL將空值視為對(duì)節(jié)點(diǎn)或關(guān)系的屬性的缺失值或未定義值。
當(dāng)我們創(chuàng)建一個(gè)具有現(xiàn)有節(jié)點(diǎn)標(biāo)簽名稱(chēng)但未指定其屬性值的節(jié)點(diǎn)時(shí),它將創(chuàng)建一個(gè)具有NULL屬性值的新節(jié)點(diǎn)。
match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label
IN操作符
與SQL一樣,Neo4j CQL提供了一個(gè)IN運(yùn)算符,以便為CQL命令提供值的集合。
INDEX索引
Neo4j SQL支持節(jié)點(diǎn)或關(guān)系屬性上的索引,以提高應(yīng)用程序的性能。
我們可以為具有相同標(biāo)簽名稱(chēng)的所有節(jié)點(diǎn)的屬性創(chuàng)建索引。
我們可以在MATCH或WHERE或IN運(yùn)算符上使用這些索引列來(lái)改進(jìn)CQL Command的執(zhí)行。
在Neo4j數(shù)據(jù)庫(kù)中,CQL CREATE命令始終創(chuàng)建新的節(jié)點(diǎn)或關(guān)系,這意味著即使您使用相同的值,它也會(huì)插入一個(gè)新行。 根據(jù)我們對(duì)某些節(jié)點(diǎn)或關(guān)系的應(yīng)用需求,我們必須避免這種重復(fù)。
像SQL一樣,Neo4j數(shù)據(jù)庫(kù)也支持對(duì)NODE或Relationship的屬性的
UNIQUE約束
UNIQUE約束的優(yōu)點(diǎn)
3.3 常用函數(shù)
字符串函數(shù)
創(chuàng)建實(shí)體
@NodeEntity:標(biāo)明是一個(gè)節(jié)點(diǎn)實(shí)體 @RelationshipEntity:標(biāo)明是一個(gè)關(guān)系實(shí)體 @Id:實(shí)體主鍵
@Property:實(shí)體屬性 @GeneratedValue:實(shí)體屬性值自增 @StartNode:開(kāi)始節(jié)點(diǎn)(可以理解為父節(jié)點(diǎn)) @EndNode:結(jié)束節(jié)點(diǎn)(可以理解為子節(jié)點(diǎn))
創(chuàng)建接口繼承Neo4jRepository
測(cè)試
基于Neo4j的知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)推薦(附鏈接):
大數(shù)據(jù)知識(shí)圖譜——基于知識(shí)圖譜+flask的大數(shù)據(jù)(KBQA)nlp醫(yī)療知識(shí)問(wèn)答系統(tǒng)(全網(wǎng)最詳細(xì)講解及源碼)
https://dsjmyx.blog.csdn.net/article/details/129147862?spm=1001.2014.3001.5502
我已把本博文資料整理成壓縮包,需要的小伙伴可以在主頁(yè)資源處自取。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-406821.html
希望本篇文章能對(duì)各位有所幫助!喜歡的小伙伴可以點(diǎn)贊關(guān)注收藏,我會(huì)分享更多關(guān)于大數(shù)據(jù)領(lǐng)域方面的優(yōu)質(zhì)內(nèi)容,感謝各位的喜歡與支持!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-406821.html
到了這里,關(guān)于圖數(shù)據(jù)庫(kù)Neo4j實(shí)戰(zhàn)(全網(wǎng)最詳細(xì)教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!