目錄
Neo4j?基礎(chǔ)
什么是Neo4j
Neo4j?模塊構(gòu)建
Neo4j的主要應(yīng)用場景
Neo4j?環(huán)境搭建
Docker 安裝Neo4j
Neo4j數(shù)據(jù)瀏覽器
?Neo4j CQL
CQL簡介
Neo4j CQL高級
CQL?函數(shù)
CQL多深度關(guān)系節(jié)點
事務(wù)
索引
約束
Neo4j之Admin管理員操作
Neo4j -?數(shù)據(jù)庫備份和恢復(fù)
調(diào)優(yōu)思路
?Neo4j?程序訪問
SpringBoot?整合Neo4j
Neo4j?基礎(chǔ)
什么是Neo4j
Neo4j是一個開源的 無Shcema的 基于java開發(fā)的 圖形數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲在圖中而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務(wù)特性的Java持久化引擎。程序數(shù)據(jù)是在一個面向?qū)ο蟮?、靈活的網(wǎng)絡(luò)結(jié)構(gòu)下,而不是嚴格、靜態(tài)的表中,但可以享受到具備完全的事務(wù)特性、企業(yè)級的數(shù)據(jù)庫的所有好處。
https://db-engines.com/en/ranking
Neo4j?模塊構(gòu)建
Neo4j?主要構(gòu)建塊
- 節(jié)點
- 屬性
- 關(guān)系
- 標簽
- 數(shù)據(jù)瀏覽器
節(jié)點
節(jié)點是圖表的基本單位。 它包含具有鍵值對的屬性
屬性
屬性是用于描述圖節(jié)點和關(guān)系的鍵值對
Key =值
其中Key是一個字符串
值可以通過使用任何Neo4j數(shù)據(jù)類型來表示
關(guān)系
關(guān)系是圖形數(shù)據(jù)庫的另一個主要構(gòu)建塊。 它連接兩個節(jié)點,如下所示。
?這里Emp和Dept是兩個不同的節(jié)點。?“WORKS_FOR”是Emp和Dept節(jié)點之間的關(guān)系。
因為它表示從Emp到Dept的箭頭標記,那么這種關(guān)系描述的一樣
Emp WORKS_FOR Dept
每個關(guān)系包含一個起始節(jié)點和一個結(jié)束節(jié)點。
這里“Emp”是一個起始節(jié)點。
“Dept”是端節(jié)點。
由于該關(guān)系箭頭標記表示從“Emp”節(jié)點到“Dept”節(jié)點的關(guān)系,該關(guān)系被稱為“進入關(guān)系”到“Dept”節(jié)點。
并且“外向關(guān)系”到“Emp”節(jié)點。
像節(jié)點一樣,關(guān)系也可以包含屬性作為鍵值對。
標簽
Label將一個公共名稱與一組節(jié)點或關(guān)系相關(guān)聯(lián)。 節(jié)點或關(guān)系可以包含一個或多個標簽。 我們可以為現(xiàn)
有節(jié)點或關(guān)系創(chuàng)建新標簽。 我們可以從現(xiàn)有節(jié)點或關(guān)系中刪除現(xiàn)有標簽。
從前面的圖中,我們可以觀察到有兩個節(jié)點。
左側(cè)節(jié)點都有一個標簽:“EMP”,而右側(cè)節(jié)點都有一個標簽:“Dept”。
這兩個節(jié)點之間的關(guān)系,也有一個標簽:“WORKS_FOR”
注:?-Neo4j將數(shù)據(jù)存儲在節(jié)點或關(guān)系的屬性中。
Neo4j的主要應(yīng)用場景
社交媒體和社交網(wǎng)絡(luò)
當(dāng)使用圖形數(shù)據(jù)庫為社交網(wǎng)絡(luò)應(yīng)用程序提供動力時,可以輕松利用社交關(guān)系或根據(jù)活動推斷關(guān)系。
查詢社區(qū)聚類分析,朋友的朋友推薦,影響者分析,共享和協(xié)作關(guān)系分析等
推薦引擎和產(chǎn)品推薦系統(tǒng)
圖形驅(qū)動的推薦引擎通過實時利用多種連接,幫助公司個性化產(chǎn)品,內(nèi)容和服務(wù)。
內(nèi)容和媒體推薦,圖形輔助搜索引擎,產(chǎn)品推薦,專業(yè)網(wǎng)絡(luò),社會推薦。
身份和訪問管理
使用圖形數(shù)據(jù)庫進行身份和訪問管理時,可以快速有效地跟蹤用戶,資產(chǎn),關(guān)系和授權(quán)。
查詢訪問管理,資產(chǎn)來源,數(shù)據(jù)所有權(quán),身份管理,互連組織,主數(shù)據(jù),資源授權(quán)
金融反欺詐多維關(guān)聯(lián)分析場景
通過圖分析可以清楚地知道洗錢網(wǎng)絡(luò)及相關(guān)嫌疑,例如對用戶所使用的帳號、發(fā)生交易時的IP地址、MAC地址、手機IMEI號等進行關(guān)聯(lián)分析。
Neo4j?環(huán)境搭建
Neo4j環(huán)境Linux下搭建
(1).切換到Linux下 到安裝目錄neo4j?上傳安裝包 或者 下載安裝包
使用?ftp?工具上傳neo4j-community-3.5.17.tar?到?liunx?下
或者?wget?https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz
(2).?解壓
tar -xvf neo4j-community-3.5.17.tar
(3).?修改配置文件?neo4j.conf
vi conf/neo4j.conf
主要是修改 允許遠程訪問的地址 把對應(yīng)的注釋打開即可
dbms.connectors.default_listen_address=0.0.0.0
(4).開放對應(yīng)的訪問端口 默認要開放7474?和?7687
fifirewall-cmd --zone=public --add-port=7474/tcp --permanent
fifirewall-cmd --zone=public --add-port=7687/tcp --permanent
systemctl reload fifirewalld
(5).啟動
./bin/neo4j start
(6).使用瀏覽器 訪問服務(wù)器上的?neo4j
http://192.168.8.128:7474
默認的賬號是?neo4j?密碼?neo4j?這里第一次登錄的話會要求修改密碼
Docker 安裝Neo4j
1.拉取Neo4j鏡像
docker pull neo4j
2. 簡單運行Neo4j
docker run -d --name neo4j ?-p 7474:7474 -p 7687:7687 ?neo4j
3.查看日志是否啟動成功
docker logs -f neo4j?
4.訪問數(shù)據(jù)瀏覽器查看是否成功
http://192.168.8.128:7474/browser
如需掛載目錄:
- data——數(shù)據(jù)存放的文件夾
- logs——運行的日志文件夾
- conf——數(shù)據(jù)庫配置文件夾(在配置文件neo4j.conf中配置包括開放遠程連接、設(shè)置默認激活的數(shù)據(jù)庫)
- import——為了大批量導(dǎo)入csv來構(gòu)建數(shù)據(jù)庫,需要導(dǎo)入的節(jié)點文件nodes.csv和關(guān)系文件rel.csv需要放到這個文件夾下)
docker run -d --name container_name \ //-d表示容器后臺運行 --name指定容器名字
-p 7474:7474 -p 7687:7687 \ //映射容器的端口號到宿主機的端口號
-v /home/neo4j/data:/data \ //把容器內(nèi)的數(shù)據(jù)目錄掛載到宿主機的對應(yīng)目錄下
-v /home/neo4j/logs:/logs \ //掛載日志目錄
-v /home/neo4j/conf:/var/lib/neo4j/conf //掛載配置目錄
-v /home/neo4j/import:/var/lib/neo4j/import \ //掛載數(shù)據(jù)導(dǎo)入目錄
--env NEO4J_AUTH=neo4j/password \ //設(shè)定數(shù)據(jù)庫的名字的訪問密碼
neo4j //指定使用的鏡像
Neo4j數(shù)據(jù)瀏覽器
數(shù)據(jù)瀏覽器訪問
一旦我們安裝Neo4j,我們可以訪問Neo4j數(shù)據(jù)瀏覽器使用以下URL
http:// localhost:7474/browser/
?Neo4j數(shù)據(jù)瀏覽器用于執(zhí)行CQL命令并查看輸出輸出。
這里我們需要在美元提示符處執(zhí)行所有CQL命令:“$”?如?CREATE(cc:CreditCard)在美元符號后鍵入命令,然后單擊“執(zhí)行”按鈕運行命令。
它與Neo4j數(shù)據(jù)庫服務(wù)器交互,檢索和顯示下面的結(jié)果到那個美元提示。
使用“VI視圖”按鈕以圖形格式查看結(jié)果。 上圖以“UI視圖”格式顯示結(jié)果。
導(dǎo)出?CSV?或者?JSON
單擊“導(dǎo)出CSV”按鈕以csv文件格式導(dǎo)出結(jié)果
?Neo4j CQL
CQL簡介
CQL代表Cypher查詢語言。 像關(guān)系型數(shù)據(jù)庫具有查詢語言SQL,Neo4j使用CQL作為查詢語言。
Neo4j CQL
- 它是Neo4j圖形數(shù)據(jù)庫的查詢語言。
- 它是一種聲明性模式匹配語言。
- 它遵循SQL語法。
- 它的語法是非常簡單且人性化、可讀的格式。
常用的Neo4j CQL命令/條款如下:
S.No.? |
CQL命令/條? |
作用 |
1 | CREATE?創(chuàng)建? |
創(chuàng)建節(jié)點,關(guān)系和屬性 |
2 | MATCH?匹配? |
檢索有關(guān)節(jié)點,關(guān)系和屬性數(shù)據(jù) |
3 | RETURN?返回 |
返回查詢結(jié)果 |
4 | WHERE?條件 |
提供條件過濾檢索MATCH數(shù)據(jù) |
5 | DELETE?刪除 |
刪除節(jié)點和關(guān)系 |
6 | REMOVE?移除 |
刪除節(jié)點和關(guān)系的屬性 |
7 | SET?設(shè)置 |
添加或更新標簽 |
8 | ORDER BY?排序 |
對結(jié)果排序 |
9 | SKIP LIMIT?分頁 |
分頁 |
10 | DISTINCT?排重 |
排重 |
?CREATE
CREATE (?
<node-name>:<label-name>?
[{?
<property1-name>:<property1-Value>?
........?
<propertyn-name>:<propertyn-Value>?
}]?
)
語法說明:
語法元素 | 描述 |
< node-name> | 它是我們將要創(chuàng)建的節(jié)點名稱。 |
< label-name> | ?它是一個節(jié)點標簽名稱 |
< property1-name>...< propertyn-name> |
屬性是鍵值對。 定義將分配給創(chuàng)建節(jié)點的屬性的名稱 |
< property1-value>...< propertyn-value>? |
屬性是鍵值對。 定義將分配給創(chuàng)建節(jié)點的屬性的值 |
舉例:
CREATE?(person:Person {cid:1,name:"小張",age:24,gender:0,character:"A",money:1000});?
MATCH RETURN命令語法?
MATCH?
(?
<node-name>:<label-name>?
)
RETURN?
<node-name>.<property1-name>,?
...?
<node-name>.<propertyn-name>
語法元素 | 描述 |
< node-name>? |
它是我們將要創(chuàng)建的節(jié)點名稱。 |
< label-name>? |
?它是一個節(jié)點標簽名稱 |
< property1-name>...< propertyn-name> |
屬性是鍵值對。 定義將分配給創(chuàng)建節(jié)點的屬性的名稱 |
舉例:
MATCH (person:Person) return person?
MATCH (person:Person) return person.name,person.age?
關(guān)系創(chuàng)建
- 使用現(xiàn)有節(jié)點創(chuàng)建沒有屬性的關(guān)系
MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)?
CREATE
(<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-?
name>)?
RETURN?相應(yīng)的內(nèi)容?
語法說明:
S.No.? | 語法元素 | 描述 |
1 | MATCH,CREATE,RETURN? | 他們是Neo4J CQL關(guān)鍵字。 |
2 | < noode1-name> | ?它用于創(chuàng)建關(guān)系的“From Node”的名稱。 |
3 | < node1-label-name>? | 它用于創(chuàng)建關(guān)系的“From Node”的標簽名稱。 |
4 | < node2-name>? | 它用于創(chuàng)建關(guān)系的“To Node”的名稱。 |
5 | < node2-label-name>? | 它用于創(chuàng)建關(guān)系的“To Node”的標簽名稱。 |
6 | < relationship-name>? | 這是一個關(guān)系的名稱。 |
7 | < relationship-label-name> | ?它是一個關(guān)系的標簽名稱。 |
舉例:
創(chuàng)建關(guān)系?
match(person:Person {name:"小張"}) ,(person2:Person {name:"小林"})?create(person)-[r:Couple]->(person2);?
查詢關(guān)系?
match p = (person:Person {name:"小張"})-[r:Couple]->(person2:Person) return p?
match (p1:Person {name:"小張"})-[r:Couple]-(p2:Person) return p1,p2?
match (p1:Person {name:"小張"})-[r:Couple]-(p2:Person) return r
- 使用現(xiàn)有節(jié)點創(chuàng)建有屬性的關(guān)系
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)?
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>?
{<define-properties-list>}]->(<node2-label-name>)?
RETURN <relationship-label-name>?
其中<define-properties-list>?是分配給新創(chuàng)建關(guān)系的屬性(名稱?-?值對)的列表。?
{?
<property1-name>:<property1-value>,?
<property2-name>:<property2-value>,?
...?
<propertyn-name>:<propertyn-value>?
}
舉例:
match(person:Person {name:"小張"}),(person2:Person {name:"小林"})?
create(person)-[r:Couple{mary_date:"12/12/2014",price:55000}]->(person2)?
return r;?
- 使用新節(jié)點創(chuàng)建沒有屬性的關(guān)系
CREATE?
(<node1-label-name>:<node1-name>)?
-[<relationship-label-name>:<relationship-name>]->?
(<node1-label-name>:<node1-name>)?
舉例:
create
(person1:Person {cid:4,name:"小王",age:49,gender:1,character:"A",money:5000})?
-[r:Friend]->?
(person2:Person{cid:7,name:"小劉",age:48,gender:0,character:"B",money:100})?
- 使用新節(jié)點創(chuàng)建有屬性的關(guān)系
CREATE?
(<node1-label-name>:<node1-name>{<define-properties-list>})?
-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]?
->(<node1-label-name>:<node1-name>{<define-properties-list>})?
舉例:
create
(person1:Person {cid:9,name:"王武",age:23,gender:0,character:"A",money:3000})?
<-[r:Friend {date:"11-02-2000"}]->?
(person2:Person {cid:8,name:"趙六",age:24,gender:0,character:"B",money:6000})
關(guān)系和節(jié)點的屬性可以使用的類型
Index | CQL數(shù)據(jù)類型 | 作用 |
1 | boolean? | 它用于表示布爾文字:true, false。 |
2 | byte? | 它用來表示8位整數(shù)。 |
3 | short? | 它用于表示16位整數(shù)。 |
4 | int? | 它用于表示32位整數(shù) |
5 | Long? | 它用于表示64位整數(shù)。 |
6 | float? | 浮點數(shù)用于表示32位浮點數(shù)。 |
7 | double | Double用于表示64位浮點數(shù)。 |
8 | char | Char用于表示16位字符。 |
9 | String? | 字符串用于表示字符串。 |
CREATE創(chuàng)建多個標簽
CREATE?(<node-name>:<label-name1>:<label-name2>.....:<label-namen>)?
如:?
CREATE?(person:Person:Beauty:Picture {cid:20,name:"小美女"})?
WHERE?子句
簡單的WHERE子句?
WHERE?<condition>?
復(fù)雜的WHERE子句?
WHERE?<condition> <boolean-operator> <condition>?
where?中的比較運算符 和 之前mysql的相同 如?= != <> > <?等
S.No. | ?布爾運算符 | 描述 |
1 | AND? | 與? |
2 | OR? | 或? |
3 | NOT? | 非 |
舉例:
MATCH (person:Person)?
WHERE?person.name =?'小張'?OR person.name =?'小王'?
RETURN person
DELETE?子句 和?REMOVE子句
DELETE?子句
- 刪除節(jié)點。
- 刪除節(jié)點及相關(guān)節(jié)點和關(guān)系。
match p = (:Person {name:"小王"})-[r:Couple]-(:Person)?delete?r?
REMOVE子句
- 刪除節(jié)點或關(guān)系的標簽
- 刪除節(jié)點或關(guān)系的屬性
MATCH (person:Person {name:"小美女"}) ?REMOVE person.cid?
SET子句
- 向現(xiàn)有節(jié)點或關(guān)系添加新屬性
- 更新屬性值
MATCH (person:Person {cid:1})?
SET?person.money =?3456,person.age=25?
ORDER BY?子句
“ORDER BY”子句,對MATCH查詢返回的結(jié)果進行排序。
我們可以按升序或降序?qū)π羞M行排序。
默認情況下,它按升序?qū)π羞M行排序。 如果我們要按降序?qū)λ鼈冞M行排序,我們需要使用DESC子句。
MATCH (person:Person)?
RETURN person.name,person.money?
ORDER BY?person.money?DESC?
SKIP?和?LIMIT
Neo4j CQL已提供“SKIP”子句來過濾或限制查詢返回的行數(shù)。 它修整了CQL查詢結(jié)果集頂部的結(jié)果。
Neo4j CQL已提供“LIMIT”子句來過濾或限制查詢返回的行數(shù)。 它修剪CQL查詢結(jié)果集底部的結(jié)果。
MATCH (person:Person)?
RETURN ID(person),person.name,person.money?
ORDER BY person.money DESC skip 4 limit 2
DISTINCT?排重
這個函數(shù)的用法就像SQL中的distinct關(guān)鍵字,返回的是所有不同值。
MATCH (p:Person) RETURN Distinct(p.character)?
Neo4j CQL高級
CQL?函數(shù)
字符串函數(shù)
S.No.? | 功能 | 描述 |
1 | UPPER? | 它用于將所有字母更改為大寫字母。 |
2 | LOWER? | 它用于將所有字母改為小寫字母。 |
3 | SUBSTRING? | 它用于獲取給定String的子字符串。 |
4 | REPLACE? | 它用于替換一個字符串的子字符串。 |
舉例:
MATCH (p:Person)?
RETURN ID(p),LOWER(p.character)?
match(p:Person) return?
p.character,lower(p.character),p.name,substring(p.name,2),replace(p.name,"子","zi")?
聚合函數(shù)
S.No.? | 聚集功能 | 描述 |
1 | COUNT? | 它返回由MATCH命令返回的行數(shù)。 |
2 | MAX? | 它從MATCH命令返回的一組行返回最大值。 |
3 | MIN? | 它返回由MATCH命令返回的一組行的最小值。 |
4 | SUM? | 它返回由MATCH命令返回的所有行的求和值。 |
5 | AVG? | 它返回由MATCH命令返回的所有行的平均值。 |
舉例:
MATCH (p:Person)?
RETURN MAX(p.money),SUM(p.money)
關(guān)系函數(shù)
S.No.? | 聚集功能 | 描述 |
1 | STARTNODE? | 它用于知道關(guān)系的開始節(jié)點。 |
2 | ENDNODE? | 它用于知道關(guān)系的結(jié)束節(jié)點。 |
3 | ID? | 它用于知道關(guān)系的ID |
4 | TYPE? | 它用于知道字符串表示中的一個關(guān)系的TYPE。 |
舉例:
match p = (:Person {name:"小王"})-[r:Couple]-(:Person)?
RETURN STARTNODE(r)?
shortestPath?函數(shù)返回最短的path
MATCH p=shortestPath( (node1)-[*]-(node2) )?
RETURN length(p), nodes(p)?
舉例:
MATCH p=shortestPath((person:Person {name:"小王"})-[*]-(person2:Person?
{name:"王武"}) ) RETURN length(p), nodes(p)
CQL多深度關(guān)系節(jié)點
使用with關(guān)鍵字
查詢?nèi)龑蛹夑P(guān)系節(jié)點如下:with可以將前面查詢結(jié)果作為后面查詢條件
match (na:Person)-[re]->(nb:Person) where na.name="小張" WITH na,re,nb match (nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
match (na:Person)-[re]->(nb:Person) where na.name="小林" WITH na,re,nb match (nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
直接拼接關(guān)系節(jié)點查詢
match (na:Person{name:"小張"})-[re]->(nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
為了方便,可以將查詢結(jié)果賦給變量,然后返回
match data=(na:Person{name:"小張"})-[re]->(nb:Person)-[re2]->(nc:Person) return data
使用深度運算符
當(dāng)實現(xiàn)多深度關(guān)系節(jié)點查詢時,顯然使用以上方式比較繁瑣。
可變數(shù)量的關(guān)系->節(jié)點可以使用-[:TYPE*minHops..maxHops]-。
查詢:
match data=(na:Person{name:"小張"})-[*1..2]-(nb:Person) return data
事務(wù)
為了保持數(shù)據(jù)的完整性和保證良好的事務(wù)行為,Neo4j也支持ACID特性 。
注意:?
(1)所有對Neo4j數(shù)據(jù)庫的數(shù)據(jù)修改操作都必須封裝在事務(wù)里。?
(2)默認的isolation level是READ_COMMITTED。?
(3)死鎖保護已經(jīng)內(nèi)置到核心事務(wù)管理 。?(Neo4j會在死鎖發(fā)生之前檢測死鎖并拋出異常。在異常拋出之前,事務(wù)會被標志為回滾。當(dāng)事務(wù)結(jié)束時,事務(wù)會釋放它所持有的鎖,則該事務(wù)的鎖所引起的死鎖也就是解除,其他事務(wù)就可以繼續(xù)執(zhí)行。當(dāng)用戶需要時,拋出異常的事務(wù)可以嘗試重新執(zhí)行)?
(4)除特別說明,Neo4j的API的操作都是線程安全的,Neo4j數(shù)據(jù)庫的操作也就沒有必要使用外部的同步方法。
索引
簡介
Neo4j CQL支持節(jié)點或關(guān)系屬性上的索引,以提高應(yīng)用程序的性能。
可以為具有相同標簽名稱的屬性上創(chuàng)建索引。
可以在MATCH或WHERE等運算符上使用這些索引列來改進CQL?的執(zhí)行。
創(chuàng)建單一索引
CREATE INDEX ON :Label(property)
例如:
CREATE INDEX ON :Person(name)
創(chuàng)建復(fù)合索引
CREATE INDEX ON :Person(age, gender)
全文模式索引
之前的常規(guī)模式索引只能對字符串進行精確匹配或者前后綴索(startswith,endswith,contains),全文索引將標記化索引字符串值,因此它可以匹配字符串中任何位置的術(shù)語。索引字符串如何被標記化并分解為術(shù)語,取決于配置全文模式索引的分析器。索引是通過屬性來創(chuàng)建,便于快速查找節(jié)點或者關(guān)系。
創(chuàng)建和配置全文模式索引
使用db.index.fulltext.createNodeIndex和db.index.fulltext.createRelationshipIndex創(chuàng)建全文模式索引。在創(chuàng)建索引時,每個索引必須為每個索引指定一個唯一的名稱,用于在查詢或刪除索引時引用相關(guān)的特定索引。然后,全文模式索引分別應(yīng)用于標簽列表或關(guān)系類型列表,分別用于節(jié)點和關(guān)系索引,然后應(yīng)用于屬性名稱列表。
call db.index.fulltext.createNodeIndex("索引名",[Label,Label],[屬性,屬性])?
call db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name",?
"description"])
call db.index.fulltext.queryNodes("nameAndDescription", "小張") YIELD node, score?
RETURN node.name, node.description, score
查看和刪除索引
call db.indexes?或者?:schema
DROP INDEX ON :Person(name)
DROP INDEX ON :Person(age, gender)
call db.index.fulltext.drop("nameAndDescription")
約束
唯一性約束
作用
- 避免重復(fù)記錄。
- 強制執(zhí)行數(shù)據(jù)完整性規(guī)則
創(chuàng)建唯一性約束
CREATE CONSTRAINT ON (變量:<label_name>) ASSERT?變量.<property_name> IS UNIQUE
具體實例:
CREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUE
刪除唯一性約束
DROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUE
3.5.2?屬性存在約束?(企業(yè)版中可用)?
CREATE CONSTRAINT ON (p:Person) ASSERT exists(p.name)
查看約束
call db.constraints?
:schema
Neo4j之Admin管理員操作
Neo4j -?數(shù)據(jù)庫備份和恢復(fù)
在對Neo4j數(shù)據(jù)進行備份、還原、遷移的操作時,首先要關(guān)閉neo4j
./bin/neo4j stop?
數(shù)據(jù)備份到文件
./bin/neo4j-admin dump --database=graph.db --to=/root/qyn.dump?
還原、遷移之前 ,關(guān)閉neo4j服務(wù)。操作同上
./bin/neo4j-admin load --from=/root/qyn.dump --database=graph.db --force?
重啟服務(wù)
./bin/neo4j start?
注意,運行數(shù)據(jù)備份可能會警告
WARNING: Max 1024 open fifiles allowed, minimum of 40000 recommended. See the Neo4j
manual
1.編輯這個文件
vi /etc/security/limits.conf
在文件最后加入下面這段 修改最大打開文件限制
* soft nofile 65535
* hard nofile 65535
2.重啟服務(wù)器
再次執(zhí)行上面的步驟 警告就沒有了
調(diào)優(yōu)思路
增加服務(wù)器內(nèi)存 和 調(diào)整neo4j配置文件
# java heap?初始值?
dbms.memory.heap.initial_size=1g?
# java heap?最大值,一般不要超過可用物理內(nèi)存的80%?
dbms.memory.heap.max_size=16g?
# pagecache大小,官方建議設(shè)為:(總內(nèi)存-dbms.memory.heap.max_size)/2,?
dbms.memory.pagecache.size=2g?
neo4j剛啟動數(shù)據(jù)是冷的需要預(yù)熱
MATCH (n)?
OPTIONAL MATCH (n)-[r]->()?
RETURN count(n.name) + count(r);
查看執(zhí)行計劃進行索引優(yōu)化
Cypher查詢計劃程序?qū)⒚總€查詢轉(zhuǎn)換為執(zhí)行計劃。 執(zhí)行計劃告訴Neo4j在執(zhí)行查詢時要執(zhí)行哪些操作。
對執(zhí)行計劃的生成,Neo4j使用的都是基于成本的優(yōu)化器(Cost Based Optimizer,CBO),用于制訂精確的執(zhí)行過程??梢圆捎萌缦聝煞N不同的方式了解其內(nèi)部的工作機制:
EXPLAIN:是解釋機制,加入該關(guān)鍵字的Cypher語句可以預(yù)覽執(zhí)行的過程但并不實際執(zhí)行,所以也不會產(chǎn)生任何結(jié)果。
PROFILE:則是畫像機制,查詢中使用該關(guān)鍵字,不僅能夠看到執(zhí)行計劃的詳細內(nèi)容,也可以看到查詢的執(zhí)行結(jié)果。
關(guān)注指標:?
estimated rows: 需要被掃描行數(shù)的預(yù)估值?
dbhits: 實際運行結(jié)果的命中績效?
兩個值都是越小越好
使用索引和不使用索引對比
profile?MATCH (p { name : '小張' }) RETURN p
在之前加上profile來進行查詢,可以查看查詢計劃
?Neo4j?程序訪問
SpringBoot?整合Neo4j
1.導(dǎo)入jar包?
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zql</groupId>
<artifactId>spring-boot-neo4j-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-neo4j-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.配置文件?application.yml
spring:
data:
neo4j:
username: neo4j
password: neo4j
uri: bolt://localhost:7687
3.建立實體類
@Data
@ToString
public class Person {
@Id
@GeneratedValue
private Long id;
@Property("cid")
private int pid;
@Property
private String name;
private String character;
private double money;
private int gender;
private int age;
private String description;
}
4.數(shù)據(jù)持久化類
@Repository
public interface PersonRepository extends Neo4jRepository<Person,Long> {
@Query("MATCH (p:Person) where p.money > $money return p")
List<Person> personList(@Param("money")Double money);
@Query("MATCH p=shortestPath((person:Person {name:{0}})-[*1..4]- (person2:Person {name:{1}}) ) RETURN p")
List<Person> shortestPath(String startName,String endName);
}
5.編寫服務(wù)類文章來源:http://www.zghlxwxcb.cn/news/detail-495355.html
@Service
public class Neo4jPersonService {
@Autowired
private PersonRepository personRepository;
public List<Person> personList(Double money){
return personRepository.personList(money);
}
public List<Person> personAll(){
return personRepository.findAll();
}
public Person save(Person person){
return personRepository.save(person);
}
public List<Person> shortestPath(String startName, String endName){
return personRepository.shortestPath(startName,endName);
}
}
6.編寫測試類文章來源地址http://www.zghlxwxcb.cn/news/detail-495355.html
@SpringBootTest
class SpringBootNeo4jDemoApplicationTests {
@Autowired
private Neo4jPersonService neo4jPersonService;
/**
* 添加節(jié)點
*/
@Test
void save() {
Person person = new Person();
person.setAge(22);
person.setName("小張");
person.setGender(1);
person.setMoney(10000);
person.setGender(1);
person.setDescription("描述");
person.setCharacter("哈哈哈");
person.setPid(2);
Person person1 = neo4jPersonService.save(person);
System.out.println(person1);
}
/**
* 查詢所有節(jié)點
*/
@Test
void selectAll() {
List<Person> personList = neo4jPersonService.personAll();
System.out.println(personList);
}
/**
* 根據(jù)條件查詢節(jié)點
*/
@Test
void condition() {
List<Person> personList = neo4jPersonService.personList(new Double(1000));
System.out.println(personList);
}
/**
* 最短路徑
*/
@Test
void shortestPath() {
List<Person> personList = neo4jPersonService.shortestPath("小張", "王武");
System.out.println(personList);
}
}
到了這里,關(guān)于Neo4j 圖形數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!