neo4j圖數(shù)據(jù)庫
前言:NoSQL數(shù)據(jù)庫四大家族 列存儲(chǔ) Hbase,鍵值(Key-Value)存儲(chǔ) Redis,圖像存儲(chǔ) Neo4j,文檔存儲(chǔ) MongoDB一、簡介1.1 什么是neo4jNe
前言:NoSQL數(shù)據(jù)庫四大家族 列存儲(chǔ) Hbase,鍵值(Key-Value)存儲(chǔ) Redis,圖像存儲(chǔ) Neo4j,文檔存儲(chǔ) MongoDB
一、簡介
1.1 什么是neo4j
Neo4j是以原生圖形數(shù)據(jù)庫為核心,以更自然的連接狀態(tài)存儲(chǔ)和管理數(shù)據(jù)。 是用 Java 和 Scala 編寫的,源代碼可在GitHub上找到。
圖數(shù)據(jù)庫采用屬性圖方式,對(duì)遍歷性能和操作運(yùn)行時(shí)間都有好處。
1.1.1 什么是圖數(shù)據(jù)庫
圖數(shù)據(jù)庫是使用圖數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),圖數(shù)據(jù)結(jié)構(gòu)由可以通過關(guān)系連接的節(jié)點(diǎn)組成,如下圖

Neo4j 屬性圖數(shù)據(jù)庫模型包括: - 節(jié)點(diǎn)描述域的實(shí)體(離散對(duì)象)。 - 節(jié)點(diǎn)可以有零個(gè)或多個(gè)標(biāo)簽來定義(分類)它們是什么類型的節(jié)點(diǎn)。 - 關(guān)系描述了源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)之間的連接。 - 關(guān)系總是有一個(gè)方向(一個(gè)方向)。 - 關(guān)系必須有一個(gè)類型(一種類型)來定義(分類)它們是什么類型的關(guān)系。 - 節(jié)點(diǎn)和關(guān)系可以具有進(jìn)一步描述它們的屬性(鍵值對(duì))

我們可以從上圖來認(rèn)識(shí)下圖數(shù)據(jù)庫模型 - 節(jié)點(diǎn):三個(gè)方框 - 標(biāo)簽:方框上半部分 - 節(jié)點(diǎn)屬性:方框下半部分 - 關(guān)系:虛線和實(shí)線 - 關(guān)系類型:ACTED_IN和DIRECTED - 關(guān)系屬性:roles=['Forrest']
1.2 neo4j歷史
Neo4j 最初是作為嵌入式 Java 數(shù)據(jù)庫創(chuàng)建的;這就是名稱中的“4j”的來源。Neo4j 最初創(chuàng)建是為了解決創(chuàng)始人在構(gòu)建內(nèi)容管理系統(tǒng) (CMS) 時(shí)遇到的一些問題,特別是圍繞照片使用的一些權(quán)利和元數(shù)據(jù)。他們發(fā)現(xiàn)由于所有不同的連接和關(guān)系以及數(shù)據(jù)的豐富性,很難在關(guān)系數(shù)據(jù)庫中表示。所以這就是 Neo4j 最初被創(chuàng)建的原因。
創(chuàng)始人也很快意識(shí)到,除了 CMS 應(yīng)用程序中的這個(gè)嵌入式數(shù)據(jù)庫之外,還有許多其他有趣的用例。所以 Neo4j 很快演變成一個(gè)更通用的系統(tǒng)迅速被使用在個(gè)性化推薦,以及處理物流和路線、網(wǎng)絡(luò)拓?fù)鋱D等地方.
1.3為什么要使用neo4j
我們生活在一個(gè)互聯(lián)的世界中,無論是社交網(wǎng)絡(luò)、支付網(wǎng)絡(luò)還是道路網(wǎng)絡(luò),您都會(huì)發(fā)現(xiàn)一切都是相互關(guān)聯(lián)的關(guān)系圖
傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)格式很難處理數(shù)據(jù)之前的關(guān)聯(lián)關(guān)系,就算有主鍵關(guān)聯(lián),隨著深度加深難度指數(shù)上升,而因?yàn)閚eo4j使用的是圖數(shù)據(jù)庫的方式存儲(chǔ),意味著我們不需要使用特殊屬性(例如外鍵)或帶外處理(例如 map-reduce)來推斷實(shí)體之間的連接。通過將節(jié)點(diǎn)和關(guān)系組裝成連接的結(jié)構(gòu),圖數(shù)據(jù)庫使我們能夠構(gòu)建簡單而復(fù)雜的模型,這些模型緊密地映射到我們的問題域。
在neo4j官網(wǎng)中有一份測評(píng)報(bào)告,查找用戶好友及好友的好友,包含100萬數(shù)據(jù)的,mysql及neo4j效率對(duì)比如下
| 層級(jí) | Execution Time – MySQL | Execution Time–Neo4j |
|---|---|---|
| 2 | 0.016 | 0.010 |
| 3 | 30.267 | 0.168 |
| 4 | 1,543.505 | 1.359 |
| 5 | Not Finished in 1 Hour | 2.132 |
上述結(jié)果可以看出簡單的好友查詢neo4j比mysql快60%,查朋友的朋友時(shí),neo4j效率比mysql高180倍,深度為3時(shí),neo4j效率比mysql高1135倍,深度為五時(shí)mysql超時(shí)
二、neo4j安裝
1、官網(wǎng)下載合適版本,下載鏈接 4.0版本以上就需要jdk11支持了
2、解壓安裝包
3、bin目錄下打開cmd
4、neo4j.bat install-service安裝neo4j服務(wù)
5、neo4j.bat start啟動(dòng)
6、使用瀏覽器neo4j http://127.0.0.1:7474/
默認(rèn)的賬號(hào)是 neo4j 密碼 neo4j 這里第一次登錄的話會(huì)要求修改密碼
至此我們就可以正常使用neo4j了
我們?cè)谑褂眠^程中需要學(xué)習(xí)Cypher圖形查詢語言
三、cypher語言學(xué)習(xí)
3.1 什么是Cypher語言
Cypher 是一種聲明式圖查詢語言,允許對(duì)圖進(jìn)行富有表現(xiàn)力和高效的查詢、更新和管理。由于它與其他語言的相似性和直觀性,它是迄今為止最容易學(xué)習(xí)的圖形語言。
3.2 學(xué)習(xí)Cypher語言
3.2.1 cypher語法介紹
我們已經(jīng)知道cypher是用來查詢neo4j圖數(shù)據(jù)中的數(shù)據(jù),所以我們可以結(jié)合一個(gè)圖數(shù)據(jù)來認(rèn)識(shí)cypher語法

從上圖按照我們學(xué)習(xí)的neo4j基礎(chǔ)概念可以知道以下信息:
sally喜歡圖表技術(shù),和John是朋友,為Neo4j工作
我們通過基礎(chǔ)概念學(xué)習(xí)已經(jīng)知道圖數(shù)據(jù)是包括:節(jié)點(diǎn)(節(jié)點(diǎn)標(biāo)簽、節(jié)點(diǎn)屬性)、關(guān)系(關(guān)系類型、關(guān)系屬性),我們接下來就需要使用Cypher將這些表示出來
1. 節(jié)點(diǎn)表示
Cypher 中的節(jié)點(diǎn),是使用括號(hào)將節(jié)點(diǎn)括起來,例如(node),括號(hào)看起來與可視化表示用于我們數(shù)據(jù)模型中節(jié)點(diǎn)的圓圈的相似之處。節(jié)點(diǎn)的任何信息都可以卸載括里面包括:節(jié)點(diǎn)變量、節(jié)點(diǎn)標(biāo)簽、節(jié)點(diǎn)屬性
- 節(jié)點(diǎn)變量 如果我們查詢到一個(gè)節(jié)點(diǎn),然后想在查詢后返回節(jié)點(diǎn),我們就需要定義一個(gè)變量,就如果我們?cè)趈ava調(diào)數(shù)據(jù)庫查到數(shù)據(jù)需要對(duì)象接收一樣,如果不定義就無法在后續(xù)使用數(shù)據(jù)
- 節(jié)點(diǎn)標(biāo)簽 上述圖中我們可以看到每個(gè)節(jié)點(diǎn)都有標(biāo)簽,如果我們想篩選指定標(biāo)簽的數(shù)據(jù)或給節(jié)點(diǎn)創(chuàng)建標(biāo)簽,我們可以指定節(jié)點(diǎn)標(biāo)簽,如圖中的Person,Technology、 和Company
- 節(jié)點(diǎn)屬性 如圖中的節(jié)點(diǎn)屬性,如果我們想要按照屬性篩選或給節(jié)點(diǎn)創(chuàng)建屬性,可以指定屬性
示例:
(p:Person {name: 'Sally'})n(:Person {name: 'Sally'})
p為變量,Person為標(biāo)簽,{name: 'Sally'}為屬性
2. 關(guān)系表示
為了充分利用圖數(shù)據(jù)庫的功能,我們還需要表達(dá)節(jié)點(diǎn)之間的關(guān)系。關(guān)系在 Cypher 中使用箭頭-->或<--兩個(gè)節(jié)點(diǎn)之間表示,語法看起來像在表示中連接我們的節(jié)點(diǎn)的箭頭和線。無向關(guān)系表示為沒有箭頭,只有兩個(gè)破折號(hào)--,雖然插入必須有方向,但是在查詢的時(shí)候如果不知道方向也是可以不指定,這意味著可以在任一方向上遍歷關(guān)系
有關(guān)關(guān)系的信息,我們可以使用【】中括號(hào)編寫,有關(guān)關(guān)系的任何信息都可以寫在中括號(hào)中,如下述示例
(p:Person)-[rel:LIKES {type:'Graphs'}]->(t:Technology) n(p:Person)<-[rel:LIKES {type: 'Graphs'}]-(t:Technology) n(p:Person)-[rel:LIKES {type: 'Graphs'}]-(t:Technology)
我們也可以將一個(gè)sql賦值一個(gè)變量,可以在語句其他地方使用
sql = (p:Person)-[rel:LIKES {type: 'Graphs'}]->(t:Technology)
3.2.2 Cypher語法實(shí)踐
我們已經(jīng)知道如何通過Cypher表示圖數(shù)據(jù)中的節(jié)點(diǎn)、關(guān)系、屬性等信息,但是缺少一些關(guān)鍵字來告訴我們是要做什么動(dòng)作,比如創(chuàng)建還是查詢,見下列表格
| S.No | Cypher關(guān)鍵字 | 作用 |
|---|---|---|
| 1 | CREATE 創(chuàng)建 | 創(chuàng)建節(jié)點(diǎn),關(guān)系和屬性 |
| 2 | MATCH 匹配 | 檢索有關(guān)節(jié)點(diǎn),關(guān)系和屬性數(shù)據(jù) |
| 3 | RETURN 返回 | 返回查詢結(jié)果 |
| 4 | WHERE 條件 | 提供條件過濾檢索MATCH數(shù)據(jù) |
| 5 | DELETE 刪除 | 刪除節(jié)點(diǎn)和關(guān)系 |
| 6 | REMOVE 移除 | 刪除節(jié)點(diǎn)和關(guān)系的屬性 |
| 7 | SET 設(shè)置 | 添加或更新標(biāo)簽 |
| 8 | ORDER BY 排序 | 對(duì)結(jié)果排序 |
| 9 | SKIP LIMIT 分頁 | 分頁 |
| 10 | DISTINCT 排重 | 排重 |
接下來我們要使用這些關(guān)鍵字和我們學(xué)習(xí)的基礎(chǔ)語法在neo4j中進(jìn)行增刪改查
創(chuàng)建操作
創(chuàng)建節(jié)點(diǎn)
#創(chuàng)建單個(gè)節(jié)點(diǎn)nCREATE (n)n#創(chuàng)建多個(gè)節(jié)點(diǎn)nCREATE (n), (m)n#創(chuàng)建帶有單個(gè)標(biāo)簽的節(jié)點(diǎn)nCREATE (n:Person)n#創(chuàng)建帶有多個(gè)標(biāo)簽的節(jié)點(diǎn)nCREATE (n:Person:Swedish)n#創(chuàng)建帶有標(biāo)簽和屬性的節(jié)點(diǎn)并返回nCREATE (n:Person {name: 'Andy', title: 'Developer'}) return n.name,n.titlen#創(chuàng)建一個(gè)電影節(jié)點(diǎn)nCREATE (m:Movie {title:'測試電影'})
創(chuàng)建關(guān)系
#創(chuàng)建已知節(jié)點(diǎn)創(chuàng)建關(guān)系,并設(shè)置屬性nmatch (p:Person),(m:Movie)nwhere p.name = 'Andy' and p.title = 'Developer' and m.title = '測試電影'ncreate (p)-[r:ACTED_IN {year:1980}]->(m)nreturn p,r,mn#創(chuàng)建新的節(jié)點(diǎn)并創(chuàng)建關(guān)系ncreate (p:Person {name:"Jry"})-[r:WORK_FOR]->(m:michael{name:'Mich'})nreturn p,r,m
創(chuàng)建完整鏈路
#創(chuàng)建完整鏈路ncreate p = (Person {name:"Tom"})-[:WORK_FOR]->(michael{name:'Michael'})nreturn p
MERGE操作
MERGE操作會(huì)先進(jìn)行查詢?nèi)绻床樵兊綍?huì)進(jìn)行新建操作
#新建一個(gè)張三節(jié)點(diǎn)nmerge (p:Person {name:'張三'})nreturn pn#還是新建張三并進(jìn)行屬性匹配,由于屬性不完全匹配還是新增操作,可以看到id不同nmerge (p:Person {name:'張三',height:185})nreturn pn#匹配存在的節(jié)點(diǎn)nmerge (p:Person {name:'張三',height:185})nreturn pn#以現(xiàn)有節(jié)點(diǎn)屬性去匹配新增節(jié)點(diǎn)nMATCH (person:Person)MERGE (city:City {name: person.bornIn})nRETURN person.name, person.bornIn, cityn#創(chuàng)建節(jié)點(diǎn)時(shí)設(shè)置額外屬性nMERGE (keanu:Person {name: '李四'})nON CREATEn SET keanu.created = timestamp()nRETURN keanu.name, keanu.createdn#找到節(jié)點(diǎn)時(shí)設(shè)置額外屬性nMERGE (person:Person {name:'張三'})nON MATCHn SET person.found = truenRETURN person.name, person.foundn#ON CREATE/ON MATCH可以一起使用n#關(guān)系不存在創(chuàng)建關(guān)系nMATCHn (charlie:Person {name: '張三'}),n (wallStreet:Movie {title: '測試電影'})nMERGE (charlie)-[r:ACTED_IN]->(wallStreet)nRETURN charlie.name, type(r), wallStreet.title
更多merge操作參考官方文檔
SET操作
set操作可以用來做更新操作
新增屬性
#設(shè)置屬性nMATCH (n {name: '張三'})nSET n.surname = '胖墩'nRETURN n.name, n.surnamen#使用case-when設(shè)置屬性nMATCH (n {name: '張三'})nSET (CASE WHEN n.height = 185 THEN n END).worksIn = '工廠'nRETURN n.name, n.worksIn
更新屬性
MATCH (n {name: '張三'})nSET n.height = toString(n.height)nRETURN n.name, n.height
刪除屬性
#刪除單個(gè)屬性nMATCH (n {name: '張三'})nSET n.height = nullnRETURN n.name, n.heightn#刪除所有屬性nMATCH (p {name: 'Jry'})nSET p = {}nRETURN p.name
DELETE操作
delete可以進(jìn)行刪除節(jié)點(diǎn)操作,前提是需要將節(jié)點(diǎn)上的關(guān)系清除
MATCH (n:Person {name: '李四'})nDELETE nn#當(dāng)數(shù)據(jù)量不大,我們想清除所有數(shù)據(jù)nMATCH (n)nDETACH DELETE nn#刪除節(jié)點(diǎn)及所有關(guān)系nMATCH (n {name: 'Andy'})nDETACH DELETE nn#只刪除關(guān)系nMATCH (n {name: 'Tom'})-[r:KNOWS]->()nDELETE r
REMOVE操作
remove主要用來刪除屬性和標(biāo)簽
Neo4j 不允許存儲(chǔ)null在屬性中。相反,如果不存在值,則該屬性不存在
#刪除屬性nMATCH (a {name: '張三'})nREMOVE a.heightnRETURN a.name, a.heightn#刪除標(biāo)簽nMATCH (n {name: 'Tom'})nREMOVE n:PersonnRETURN n.name, labels(n)n#刪除多個(gè)標(biāo)簽nMATCH (n {name: 'Tom'})nREMOVE n:Person:MovienRETURN n.name, labels(n)
MATCH查詢操作
要進(jìn)行查詢操作,我們首先初始化一批數(shù)據(jù)
在安裝完成neo4j后,可以直接使用 http://127.0.0.1:7474/頁面中的示例數(shù)據(jù)來初始化數(shù)據(jù)

執(zhí)行后得到下面結(jié)果:

我們基于這些數(shù)據(jù)進(jìn)行后續(xù)的查詢操作
節(jié)點(diǎn)查詢
#查詢所有節(jié)點(diǎn)nMATCH (n)nRETURN nn#根據(jù)標(biāo)簽查詢nmatch (m:Movie)nreturn mn#和Lana Wachowski相關(guān)的數(shù)據(jù) --表示相關(guān),無視關(guān)系類型和方向nMATCH (director {name: 'Lana Wachowski'})--(movie)nRETURN movie.title
關(guān)系查詢
#查看和Lana Wachowski屬于》關(guān)系的數(shù)據(jù)nMATCH (:Person {name: 'Lana Wachowski'})-->(movie)nRETURN movie.titlen#關(guān)系匹配nMATCH (wallstreet:Movie {title: 'A Few Good Men'})<-[r:ACTED_IN]-(actor)nRETURN actor.name,rn#多關(guān)系匹配nMATCH (wallstreet:Movie {title: 'A Few Good Men'})<-[:ACTED_IN|DIRECTED]-(actor)nRETURN actor.namen#多重關(guān)系匹配nmatch (p:Person {name:'Keanu Reeves'})-[r:ACTED_IN]->(m:Movie)<-[r1:DIRECTED]-(director:Person)nreturn m.title, director.namen#可變長度關(guān)系匹配n#如下查看和Keanu Reeves相關(guān)的ACTED_IN關(guān)系節(jié)點(diǎn),路徑長度為1-3nmatch (p:Person {name:'Keanu Reeves'})-[r:ACTED_IN*1..3]->(m:Movie)nreturn m
最短路徑
#查看兩人節(jié)點(diǎn)數(shù)不超過15個(gè)的最短路徑nmatch n(p:Person {name:'Keanu Reeves'}),n(p1:Person {name:'Lilly Wachowski'}),ns = shortestPath((p)-[*..15]-(p1))nreturn sn#路徑過濾,查找路徑時(shí)不考慮PRODUCED關(guān)系nmatch n(p:Person {name:'Keanu Reeves'}),n(p1:Person {name:'Lilly Wachowski'}),ns = shortestPath((p)-[*..10]-(p1))nWHERE none(r IN relationships(s) WHERE type(r) = 'PRODUCED')nreturn s
ID查找
#id查找nMATCH (n)nWHERE id(n) = 0nRETURN nn#關(guān)系id查找nMATCH (a)-[r]-(b)nWHERE id(r) = 0nRETURN a, bn#多ID匹配nMATCH (n)nWHERE id(n) IN [0, 3, 5]nRETURN n
3.2.3cypher高級(jí)功能
字符串函數(shù)
left函數(shù)
left函數(shù)相當(dāng)于從左側(cè)開始截取字符串
RETURN left('hello', 3)
Right函數(shù)
right函數(shù)相當(dāng)于從右側(cè)開始截取字符串
RETURN right('hello', 3)
ITrim函數(shù)
ITrim函數(shù)主要去除前導(dǎo)空格
RETURN lTrim(' hello')n#返回'hello'
rTrim函數(shù)
ITrim函數(shù)主要去除后導(dǎo)空格
RETURN rTrim('hello ')n#返回'hello'
replace函數(shù)
replace函數(shù)替換目標(biāo)字符串
RETURN replace("hello", "l", "w")n#返回"hewwo"
split函數(shù)
split函數(shù)指定符號(hào)拆分字符串
RETURN split('one,two', ',')n#返回["one","two"]
更多字符串函數(shù)參考https://neo4j.com/docs/cypher-manual/current/functions/string/
聚合函數(shù)
avg函數(shù)
該函數(shù)avg()返回一組數(shù)值的平均值
MATCH (n:Person)nRETURN avg(n.born)
collect函數(shù)
該函數(shù)collect()返回一個(gè)聚合列表,其中包含表達(dá)式返回的值。任何null值都將被忽略,并且不會(huì)添加到列表中。
MATCH (n:Person)nRETURN collect(n.born)
count函數(shù)
該函數(shù)count(*)可用于返回節(jié)點(diǎn)數(shù)
#節(jié)點(diǎn)求數(shù)量nMATCH (n {name: 'Keanu Reeves'})-->(x)nRETURN labels(n), n.born, count(*)n#關(guān)系分組求數(shù)量nMATCH (n {name: 'Keanu Reeves'})-[r]->(x)nRETURN type(r), count(*)
max/min函數(shù)
該函數(shù)max/min返回一組值中的最大/小值。字符串默認(rèn)低于0
#最大nUNWIND [1, 'a', null, 0.2, 'b', '1', '99'] AS valnRETURN max(val)n#最小nUNWIND [1, 'a', null, 0.2, 'b', '1', '99'] AS valnRETURN min(val)
更多聚合函數(shù)參考https://neo4j.com/docs/cypher-manual/current/functions/aggregating/#functions-max
shortestPath 函數(shù)
返回最短路徑
MATCH p=shortestPath((person:Person {name:"Keanu Reeves"})-[*]-(person2:Personn{name:"Lilly Wachowski"}) ) RETURN length(p), nodes(p)
四、事務(wù)
為了保持?jǐn)?shù)據(jù)的完整性和保證良好的事務(wù)行為,Neo4j也支持ACID特性 。
注意:
(1)所有對(duì)Neo4j數(shù)據(jù)庫的數(shù)據(jù)修改操作都必須封裝在事務(wù)里。
(2)默認(rèn)的isolation level是READ_COMMITTED
(3)死鎖保護(hù)已經(jīng)內(nèi)置到核心事務(wù)管理 。 (Neo4j會(huì)在死鎖發(fā)生之前檢測死鎖并拋出異常。在異常拋出之前,事務(wù)會(huì)被標(biāo)志為回滾。當(dāng)事務(wù)結(jié)束時(shí),事務(wù)會(huì)釋放它所持有的鎖,則該事務(wù)的鎖所引起的死鎖也就是解除,其他事務(wù)就可以繼續(xù)執(zhí)行。當(dāng)用戶需要時(shí),拋出異常的事務(wù)可以嘗試重新執(zhí)行)
(4)除特別說明,Neo4j的API的操作都是線程安全的,Neo4j數(shù)據(jù)庫的操作也就沒有必要使用外部的同步方法。
五、索引
Neo4j CQL支持節(jié)點(diǎn)或關(guān)系屬性上的索引,以提高應(yīng)用程序的性能。
可以為具有相同標(biāo)簽名稱的屬性上創(chuàng)建索引。
可以在MATCH或WHERE等運(yùn)算符上使用這些索引列來改進(jìn)CQL 的執(zhí)行
創(chuàng)建索引
#創(chuàng)建節(jié)點(diǎn)單一屬性索引nCREATE INDEX ON:Person (name)n#創(chuàng)建復(fù)合索引nCREATE INDEX ON:Person (name,born)
查看索引
call db.indexes
刪除索引
DROP INDEX ON :Person(name)
六、約束
作用 - 避免重復(fù)記錄。 - 強(qiáng)制執(zhí)行數(shù)據(jù)完整性規(guī)則
唯一節(jié)點(diǎn)屬性約束
唯一屬性約束確保屬性值對(duì)于具有特定標(biāo)簽的所有節(jié)點(diǎn)都是唯一的。對(duì)于多個(gè)屬性的唯一屬性約束,屬性值的組合是唯一的。
唯一約束不要求所有節(jié)點(diǎn)都具有列出的屬性的唯一值——沒有對(duì)應(yīng)屬性的節(jié)點(diǎn)不受此規(guī)則的約束
#創(chuàng)建唯一節(jié)點(diǎn)屬性約束nCREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUEn#刪除唯一節(jié)點(diǎn)屬性約束nDROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUn#查看約束ncall db.constraints
六、Spring boot整合neo4j
1、增加依賴
<dependency>n <groupId>org.springframework.boot</groupId>n <artifactId>spring-boot-starter-data-neo4j</artifactId>n</dependency>n<dependency>n <groupId>org.neo4j</groupId>n <artifactId>neo4j-ogm-bolt-driver</artifactId>n</dependency>
2、增加配置
spring:n data:n neo4j:n username: neo4jn password: 123456n uri: bolt://127.0.0.1:7687
3、增加節(jié)點(diǎn)實(shí)例
@NodeEntityn@Datanpublic class Person implements Serializable {n @Idn @GeneratedValuen private Long id;n @Property("cid")n private int pid;n @Propertyn private String name;n @Relationship(type = "Friends",direction = Relationship.INCOMING)n private Set<Person> relationPersons;n}
4、增加dao類
@Repositorynpublic interface PersonDao extends Neo4jRepository<Person,Long> {n @Query("match(p:Person) where p.born > {0} return p")n List<Person> personList(Integer born);n @Query("MATCH p=shortestPath((person:Person {name:{0}})-[*1..4]- (person2:Person {name:{1}}) ) RETURN p")n List<Person> shortestPath(String startName,String endName);n}
5、增加服務(wù)類
@Servicenpublic class PersonService {n @Autowiredn private PersonDao personDao;nn public List<Person> personList(Integer born){n return personDao.personList(born);n }n public Person save(Person person){n return personDao.save(person);n }nn public List<Person> shortestPath(String startName, String endName){n return personDao.shortestPath(startName,endName);n }n}
6、測試類
@SpringBootApplicationnpublic class Neo4jSpringbootDemoApplication {nn public static void main(String[] args) {n ApplicationContext app =n SpringApplication.run(Neo4jSpringbootDemoApplication.class,args);n PersonService personService =n app.getBean(PersonService.class);n List<Person> datas = personService.personList(1980);n System.out.println(datas);n System.out.println(personService.shortestPath("Bill Pullman","Tom Hanks"));n }nn}
以上內(nèi)容就是neo4j的基礎(chǔ)概念和基礎(chǔ)使用
neo4j的官方文檔內(nèi)容非常詳細(xì),大家想深入了解可以官網(wǎng)查看
大家有更好的觀點(diǎn)可以評(píng)論或私信討論
上一篇:每天都離不開的廚房家電清單
下一篇:機(jī)加工三好四管







