Neo4J
一、Neo4J相關介紹
1.為什么需要圖數(shù)據(jù)庫
??隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實社會織起了了一張龐大而復雜的關系
網(wǎng),傳統(tǒng)數(shù)據(jù)庫很難處理關系運算。大數(shù)據(jù)行業(yè)需要處理的數(shù)據(jù)之間的關系隨數(shù)據(jù)量呈幾何級數(shù)增長,
急需一種支持海量復雜數(shù)據(jù)關系運算的數(shù)據(jù)庫,圖數(shù)據(jù)庫應運而生。
世界上很多著名的公司都在使用圖數(shù)據(jù)庫,比如:
- 社交領域:Facebook, Twitter,Linkedin用它來管理社交關系,實現(xiàn)好友推薦
- 零售領域:eBay,沃爾瑪使用它實現(xiàn)商品實時推薦,給買家更好的購物體驗
- 金融領域:摩根大通,花旗和瑞銀等銀行在用圖數(shù)據(jù)庫做風控處理
- 汽車制造領域:沃爾沃,戴姆勒和豐田等頂級汽車制造商依靠圖數(shù)據(jù)庫推動創(chuàng)新制造解決方案
- 電信領域:Verizon, Orange和AT&T 等電信公司依靠圖數(shù)據(jù)庫來管理網(wǎng)絡,控制訪問并支持客戶
360 - 酒店領域:萬豪和雅高酒店等頂級酒店公司依使用圖數(shù)據(jù)庫來管理復雜且快速變化的庫存
圖數(shù)據(jù)庫并非指存儲圖片的數(shù)據(jù)庫,而是以圖數(shù)據(jù)結構存儲和查詢數(shù)據(jù)。
??圖數(shù)據(jù)庫是基于圖論實現(xiàn)的一種NoSQL數(shù)據(jù)庫,其數(shù)據(jù)存儲結構和數(shù)據(jù)查詢方式都是以圖論為基礎的,
圖數(shù)據(jù)庫主要用于存儲更多的連接數(shù)據(jù).
??圖論〔Graph Theory〕是數(shù)學的一個分支。它以圖為研究對象圖論中的圖是由若干給定的點及連
接兩點的線所構成的圖形,這種圖形通常用來描述某些事物之間的某種特定關系,用點代表事物,
用連接兩點的線表示相應兩個事物間具有這種關系。
方案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é)點存儲在內部,它與相鄰節(jié)點連接的節(jié)點,它們通過關系相互連接。
??他們存儲這種連接的數(shù)據(jù)與上面的圖表中的相同,這樣檢索或遍歷是非常容易和更快的。
方案2:Facebook
??利用 Facebook 應用程序了解現(xiàn)實世界中 Graph 數(shù)據(jù)庫的需求。
??在上面的圖中,F(xiàn)acebook Profile“A”已經(jīng)連接到他的朋友,喜歡他的一些朋友,發(fā)送消息給他的一些朋友,跟隨他喜歡的一些名人。
??這意味著大量的連接數(shù)據(jù)配置文件A.如果我們打開其他配置文件,如配置文件B,我們將看到類似的大量的連接數(shù)據(jù)。
注- 通過觀察上述兩個應用程序,它們有很多更多的連接數(shù)據(jù)。 它是非常容易存儲和檢索,這種更連接的數(shù)據(jù)與圖形數(shù)據(jù)庫。
2.特性和優(yōu)勢
??關系查詢性能對比 在數(shù)據(jù)關系中心,圖形數(shù)據(jù)庫在查詢速度方面非常高效,即使對于深度和復雜的查詢
也是如此。在關系型數(shù)據(jù)庫和圖數(shù)據(jù)庫(Neo4j)之間進行了實驗:在一個社交網(wǎng)絡里找到最大深度為5的
朋友的朋友,他們的數(shù)據(jù)集包括100萬人,每人約有50個朋友。
實驗結果如下:
對比關系型數(shù)據(jù)庫
各種NOSQL對比
分類 | 數(shù)據(jù)模型 | 優(yōu)勢 | 劣勢 | 舉例 |
---|---|---|---|---|
鍵值對數(shù)據(jù)庫 | 哈希表 | 查找速度快 | 數(shù)據(jù)無結構化,通常只被當作字符串或者二進制數(shù)據(jù) | Redis |
列存儲數(shù)據(jù)庫 | 列式數(shù)據(jù)存儲 | 查找速度快;支持分布橫向擴展;數(shù)據(jù)壓縮率高 | 功能相對受限 | HBase |
文檔型數(shù)據(jù)庫 | 鍵值對擴展 | 數(shù)據(jù)結構要求不嚴格;表結構可變;不需要預先定義表結構 | 查詢性能不高,缺乏統(tǒng)一的查詢語法 | MongoDB |
圖數(shù)據(jù)庫 | 節(jié)點和關系組成的圖 | 利用圖結構相關算法(最短路徑、節(jié)點度關系查找等) | 可能需要對整個圖做計算,不利于圖數(shù)據(jù)分布存儲 | Neo4j |
3.什么是Neo4j
??Neo4j是一個開源的NoSQL圖形數(shù)據(jù)庫,2003 年開始開發(fā),使用 scala和java 語言,2007年開始發(fā)布。
- 是世界上最先進的圖數(shù)據(jù)庫之一,提供原生的圖數(shù)據(jù)存儲,檢索和處理;
- 采用屬性圖模型(Property graph model),極大的完善和豐富圖數(shù)據(jù)模型;
- 專屬查詢語言 Cypher,直觀,高效;
官網(wǎng): https://neo4j.com/
Neo4j的特性:
- 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應用程序
Neo4j的優(yōu)點:
- 它很容易表示連接的數(shù)據(jù)
- 檢索/遍歷/導航更多的連接數(shù)據(jù)是非常容易和快速的
- 它非常容易地表示半結構化數(shù)據(jù)
- Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習
- 使用簡單而強大的數(shù)據(jù)模型
- 它不需要復雜的連接來檢索連接的/相關的數(shù)據(jù),因為它很容易檢索它的相鄰節(jié)點或關系細節(jié)沒有
連接或索引
4.Neo4j數(shù)據(jù)模型
圖論基礎
??圖是一組節(jié)點和連接這些節(jié)點的關系,圖形以屬性的形式將數(shù)據(jù)存儲在節(jié)點和關系中,屬性是用于表示
數(shù)據(jù)的鍵值對。
??在圖論中,我們可以表示一個帶有圓的節(jié)點,節(jié)點之間的關系用一個箭頭標記表示。
最簡單的可能圖是單個節(jié)點:
我們可以使用節(jié)點表示社交網(wǎng)絡(如Google+(GooglePlus)個人資料),它不包含任何屬性。向
Google+個人資料添加一些屬性:
在兩個節(jié)點之間創(chuàng)建關系:
此處在兩個配置文件之間創(chuàng)建關系名稱“跟隨”。 這意味著 Profile-I 遵循 Profile-II。
屬性圖模型
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ù)庫或NoSQL數(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屬性。
Neo4j的構建元素
Neo4j圖數(shù)據(jù)庫主要有以下構建元素:
- 節(jié)點
- 屬性
- 關系
- 標簽
- 數(shù)據(jù)瀏覽器
有一個或多個標簽,用于描述其在圖表中的作用
屬性
??屬性(Property)是用于描述圖節(jié)點和關系的鍵值對。其中Key是一個字符串,值可以通過使用任何
- Neo4j數(shù)據(jù)類型來表示
- 屬性是命名值,其中名稱(或鍵)是字符串
- 屬性可以被索引和約束
- 可以從多個屬性創(chuàng)建復合索引
關系
??關系(Relationship)同樣是圖數(shù)據(jù)庫的基本元素。當數(shù)據(jù)庫中已經(jīng)存在節(jié)點后,需要將節(jié)點連接起來
構成圖。關系就是用來連接兩個節(jié)點,關系也稱為圖論的邊(Edge) ,其始端和末端都必須是節(jié)點,關系不
能指向空也不能從空發(fā)起。關系和節(jié)點一樣可以包含多個屬性,但關系只能有一個類型(Type) 。
關系連接兩個節(jié)點
關系是方向性的
節(jié)點可以有多個甚至遞歸的關系
關系可以有一個或多個屬性(即存儲為鍵/值對的屬性)
基于方向性,Neo4j關系被分為兩種主要類型:
- 單向關系
- 雙向關系
標簽
??標簽(Label)將一個公共名稱與一組節(jié)點或關系相關聯(lián), 節(jié)點或關系可以包含一個或多個標簽。 我們
可以為現(xiàn)有節(jié)點或關系創(chuàng)建新標簽, 我們可以從現(xiàn)有節(jié)點或關系中刪除標簽。
標簽用于將節(jié)點分組
一個節(jié)點可以具有多個標簽
對標簽進行索引以加速在圖中查找節(jié)點
本機標簽索引針對速度進行了優(yōu)化
Neo4j Browser
??一旦我們安裝Neo4j,我們就可以訪問Neo4j數(shù)據(jù)瀏覽器
5.軟件安裝
下載地址:https://neo4j.com/download-center/
安裝方式:
- Neo4j Enterprise Server
- Neo4j Community Server
- Neo4j Desktop
下載相關軟件
解壓縮即可
相關的指令
console: 直接啟動 neo4j 服務器
install-service | uninstall-service | update-service : 安裝/卸載/更新 neo4j 服務
start/stop/restart/status: 啟動/停止/重啟/狀態(tài)
-V 輸出更多信息
進入到bin目錄,執(zhí)行
neo4j console
在瀏覽器中訪問http://localhost:7474
使用用戶名neo4j和默認密碼neo4j進行連接,然后會提示更改密碼。
Neo4j Browser是開發(fā)人員用來探索Neo4j數(shù)據(jù)庫、執(zhí)行Cypher查詢并以表格或圖形形式查看結果的工
具。
當然也可以通過 Docker 來安裝
拉取鏡像
docker pull neo4j:3.5.22-community
運行鏡像
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j \
-e "NEO4J_AUTH=neo4j/123456" \
-v /usr/local/soft/neo4j/data:/data \
-v /usr/local/soft/neo4j/logs:/logs \
-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import \
neo4j:3.5.22-community
二、CQL語句
1.CQL簡介
??Neo4j的Cypher語言是為處理圖形數(shù)據(jù)而構建的,CQL代表Cypher查詢語言。像Oracle數(shù)據(jù)庫具有查詢
語言SQL,Neo4j具有CQL作為查詢語言。
- 它是Neo4j圖形數(shù)據(jù)庫的查詢語言。
- 它是一種聲明性模式匹配語言
- 它遵循SQL語法。
- 它的語法是非常簡單且人性化、可讀的格式。
2.CREATE 命令
Neo4j使用CQL“CREATE”命令
- 創(chuàng)建沒有屬性的節(jié)點
- 使用屬性創(chuàng)建節(jié)點
- 在沒有屬性的節(jié)點之間創(chuàng)建關系
- 使用屬性創(chuàng)建節(jié)點之間的關系
- 為節(jié)點或關系創(chuàng)建單個或多個標簽
語法命令
CREATE (<node-name>:<label-name>)
語法說明
注意事項 -
1、Neo4j數(shù)據(jù)庫服務器使用此<node-name>將此節(jié)點詳細信息存儲在Database.As中作為Neo4j DBA或Developer,我們不能使用它來訪問節(jié)點詳細信息。
2、Neo4j數(shù)據(jù)庫服務器創(chuàng)建一個<label-name>作為內部節(jié)點名稱的別名。作為Neo4j DBA或Developer,我們應該使用此標簽名稱來訪問節(jié)點詳細信息。
3.MATCH 命令
Neo4j CQL MATCH 命令用于
- 從數(shù)據(jù)庫獲取有關節(jié)點和屬性的數(shù)據(jù)
- 從數(shù)據(jù)庫獲取有關節(jié)點,關系和屬性的數(shù)據(jù)
語法格式:
MATCH
(
<node-name>:<label-name>
)
語法說明:
4.RETURN 子句
Neo4j CQL RETURN子句用于 -
- 檢索節(jié)點的某些屬性
- 檢索節(jié)點的所有屬性
- 檢索節(jié)點和關聯(lián)關系的某些屬性
- 檢索節(jié)點和關聯(lián)關系的所有屬性
語法結構
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
語法說明:
5.MATCH和RETURN
在Neo4j CQL中,我們不能單獨使用MATCH或RETURN命令,因此我們應該合并這兩個命令以從數(shù)據(jù)庫檢索數(shù)據(jù)。
Neo4j使用CQL MATCH + RETURN命令 -
- 檢索節(jié)點的某些屬性
- 檢索節(jié)點的所有屬性
- 檢索節(jié)點和關聯(lián)關系的某些屬性
- 檢索節(jié)點和關聯(lián)關系的所有屬性
語法結構
MATCH Command
RETURN Command
語法說明
6.CREATE+MATCH+RETURN命令
先創(chuàng)建一個客戶
create (e:Customer {id:"1001",name:"boge",location:"cs"})
創(chuàng)建一個信用卡節(jié)點
create (cc:CreditCard {id:"9999",number:"1234567890",cvv:"888",expiredate:"22/17"})
然后我們可以查詢對應的信息
match (k:customer) return k.name,k.location,k.id
還可以查詢信用卡的信息
match (m:CreditCard) return m.number,m.cvv,m.id,m.expiredate
7.關系基礎
Neo4j圖數(shù)據(jù)庫遵循屬性圖模型來存儲和管理其數(shù)據(jù)。
根據(jù)屬性圖模型,關系應該是定向的。 否則,Neo4j將拋出一個錯誤消息。
基于方向性,Neo4j關系被分為兩種主要類型。
- 單向關系
- 雙向關系
在以下場景中,我們可以使用Neo4j CQL CREATE命令來創(chuàng)建兩個節(jié)點之間的關系。 這些情況適用于Uni和雙向關系。
- 在兩個現(xiàn)有節(jié)點之間創(chuàng)建無屬性的關系
- 在兩個現(xiàn)有節(jié)點之間創(chuàng)建有屬性的關系
- 在兩個新節(jié)點之間創(chuàng)建無屬性的關系
- 在兩個新節(jié)點之間創(chuàng)建有屬性的關系
- 在具有WHERE子句的兩個退出節(jié)點之間創(chuàng)建/不使用屬性的關系
注意 -
我們將創(chuàng)建客戶和CreditCard之間的關系,如下所示:
8.CREATE創(chuàng)建標簽
CREATE標簽可以創(chuàng)建單個標簽或者多個標簽
CREATE(node-name:lable-name1:lable-name2)
還有就是可以根據(jù)CREATE語句來創(chuàng)建標簽之間的關系
CREATE (node1-name:lable1-name) - [relationship-name:relationship-lable-name]->(node2-name:lable2-name)
案例:
create (p1:Profile1)-[r1:喜歡]->(p2:Profile2)
9.WHERE子句
像SQL一樣,Neo4j CQL在CQL MATCH命令中提供了WHERE子句來過濾MATCH查詢的結果。
語法結構
WHERE <condition>
復雜的語法結構
WHERE <condition> <boolean-operator> <condition>
Neo4j支持以下布爾運算符在Neo4j CQL WHERE子句中使用以支持多個條件。
Neo4j 支持以下的比較運算符,在 Neo4j CQL WHERE 子句中使用來支持條件。
案例:
match (m:Employee) where m.age > 18 or m.id = 1002 return m
多個節(jié)點關聯(lián)查詢
where子句也可以創(chuàng)建關系
語法結構
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)
案例
match (c:customer) , (d:CreditCard) where c.id = "1001" and d.id = "9999" create (c)-[r:消費{shopdate:"2022/09/28",price:6000}]->(d) return r
10.DELETE命令
Neo4j使用CQL DELETE子句
- 刪除節(jié)點。
- 刪除節(jié)點及相關節(jié)點和關系。
對應的語法結構
DELETE <node-name-list>
注意 -
我們應該使用逗號(,)運算符來分隔節(jié)點名。
11.REMOVE命令
有時基于我們的客戶端要求,我們需要向現(xiàn)有節(jié)點或關系添加或刪除屬性。
我們使用Neo4j CQL SET子句向現(xiàn)有節(jié)點或關系添加新屬性。
我們使用Neo4j CQL REMOVE子句來刪除節(jié)點或關系的現(xiàn)有屬性。
Neo4j CQL REMOVE命令用于
- 刪除節(jié)點或關系的標簽
- 刪除節(jié)點或關系的屬性
Neo4j CQL DELETE和REMOVE命令之間的主要區(qū)別 -
- DELETE操作用于刪除節(jié)點和關聯(lián)關系。
- REMOVE操作用于刪除標簽和屬性。
Neo4j CQL DELETE和REMOVE命令之間的相似性 -
- 這兩個命令不應單獨使用。
- 兩個命令都應該與MATCH命令一起使用。
通過remove來移除標簽
match (d:`電影`) remove d:Movie
12.SET子句
有時,根據(jù)我們的客戶端要求,我們需要向現(xiàn)有節(jié)點或關系添加新屬性。
要做到這一點,Neo4j CQL 提供了一個SET子句。
Neo4j CQL 已提供 SET 子句來執(zhí)行以下操作。
- 向現(xiàn)有節(jié)點或關系添加新屬性
- 添加或更新屬性值
語法結構
SET <property-name-list>
添加屬性:
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
13.ORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對MATCH查詢返回的結果進行排序。
我們可以按升序或降序對行進行排序。
默認情況下,它按升序對行進行排序。 如果我們要按降序對它們進行排序,我們需要使用DESC子句。
語法結構
ORDER BY <property-name-list> [DESC]
舉例:
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
14.UNION合并
與SQL一樣,Neo4j CQL有兩個子句,將兩個不同的結果合并成一組結果
- UNION
- UNION ALL
UNION子句
它將兩組結果中的公共行組合并返回到一組結果中。 它不從兩個節(jié)點返回重復的行。
限制:
結果列類型和來自兩組結果的名稱必須匹配,這意味著列名稱應該相同,列的數(shù)據(jù)類型應該相同。
語法結構
<MATCH Command1>
UNION
<MATCH Command2>
注意 -
如果這兩個查詢不返回相同的列名和數(shù)據(jù)類型,那么它拋出一個錯誤。
as 來處理不同的前綴
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
UNION ALL子句
它結合并返回兩個結果集的所有行成一個單一的結果集。它還返回由兩個節(jié)點重復行。
限制
結果列類型,并從兩個結果集的名字必須匹配,這意味著列名稱應該是相同的,列的數(shù)據(jù)類型應該是相同的。
union all 語法
<MATCH Command1>
UNION ALL
<MATCH Command2>
15.LIMIT和SKIP子句
Neo4j CQL已提供“LIMIT”子句來過濾或限制查詢返回的行數(shù)。 它修剪CQL查詢結果集底部的結果。
如果我們要修整CQL查詢結果集頂部的結果,那么我們應該使用CQL SKIP子句
skip跳過
skip和limit可以結合使用達到分頁的效果
16.合并
Neo4j使用CQL MERGE命令 -
- 創(chuàng)建節(jié)點,關系和屬性
- 為從數(shù)據(jù)庫檢索數(shù)據(jù)
MERGE命令是CREATE命令和MATCH命令的組合。
MERGE = CREATE + MATCH
merge語法
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
注意 -
Neo4j CQL MERGE命令語法與CQL CREATE命令類似。
17.NULL值
Neo4j CQL將空值視為對節(jié)點或關系的屬性的缺失值或未定義值。
當我們創(chuàng)建一個具有現(xiàn)有節(jié)點標簽名稱但未指定其屬性值的節(jié)點時,它將創(chuàng)建一個具有NULL屬性值的新節(jié)點。
還可以用null 作為查詢的條件
18.IN操作符
與SQL一樣,Neo4j CQL提供了一個IN運算符,以便為CQL命令提供值的集合。
IN[<Collection-of-values>]
案例:
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
三、CQL函數(shù)
1.字符串函數(shù)
與SQL一樣,Neo4J CQL提供了一組String函數(shù),用于在CQL查詢中獲取所需的結果。
列舉幾個常用的
案例:
2.AGGEGATION聚合
和SQL一樣,Neo4j CQL提供了一些在RETURN子句中使用的聚合函數(shù)。 它類似于SQL中的GROUP BY子句。
我們可以使用MATCH命令中的RETURN +聚合函數(shù)來處理一組節(jié)點并返回一些聚合值。
3.關系函數(shù)
Neo4j CQL提供了一組關系函數(shù),以在獲取開始節(jié)點,結束節(jié)點等細節(jié)時知道關系的細節(jié)。
案例:
四、Neo4J和SpringBoot整合
添加對應的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
然后添加對應的配置文件
# neo4j配置
spring.data.neo4j.uri= bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456
1.Node的操作
然后創(chuàng)建對應的實體對象
@Data
@NodeEntity("Person")
public class Person {
@Id
@GeneratedValue
private Long id;
@Property("name")
private String name;
}
@NodeEntity:標明是一個節(jié)點實體
@RelationshipEntity:標明是一個關系實體
@Id:實體主鍵
@Property:實體屬性
@GeneratedValue:實體屬性值自增
@StartNode:開始節(jié)點(可以理解為父節(jié)點)
@EndNode:結束節(jié)點(可以理解為子節(jié)點)
然后創(chuàng)建對應的Repository接口
@Repository
public interface PersonRepository extends Neo4jRepository<Person,Long> {
}
然后我們就可以測試Node的創(chuàng)建了
@Autowired
private PersonRepository personRepository;
@Test
void contextLoads() {
Person person = new Person();
person.setName("波哥");
personRepository.save(person);
}
創(chuàng)建成功
2.Node關系的維護
創(chuàng)建關系實體
@Data
@RelationshipEntity(type = "徒弟")
public class PersonRelation implements Serializable {
@Id
@GeneratedValue
private Long id;
@StartNode
private Person parent;
@EndNode
private Person child;
@Property
private String relation;
public PersonRelation(Person parent, Person child, String relation) {
this.parent = parent;
this.child = child;
this.relation = relation;
}
}
創(chuàng)建對應的Dao持久層
@Repository
public interface PersonRelationRepository extends Neo4jRepository<PersonRelation,Long> {
}
然后測試
/**
* 節(jié)點關系
*/
@Test
void nodeRelation(){
Person p1 = new Person("唐僧",6666);
Person p2 = new Person("孫悟空",5555);
Person p3 = new Person("豬八戒",3333);
Person p4 = new Person("沙僧",2222);
Person p5 = new Person("白龍馬",1111);
// 維護 關系
PersonRelation pr1 = new PersonRelation(p1,p2,"徒弟");
PersonRelation pr2 = new PersonRelation(p1,p3,"徒弟");
PersonRelation pr3 = new PersonRelation(p1,p4,"徒弟");
PersonRelation pr4 = new PersonRelation(p1,p5,"徒弟");
personRelationRepository.save(pr1);
personRelationRepository.save(pr2);
personRelationRepository.save(pr3);
personRelationRepository.save(pr4);
}
運行后的效果:文章來源:http://www.zghlxwxcb.cn/news/detail-520010.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-520010.html
到了這里,關于Neo4J 特性CQL語句,函數(shù),Springboot集成的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!