圖數(shù)據(jù)庫Neo4j實(shí)戰(zhàn)(全網(wǎng)最詳細(xì)教程)
1. 圖數(shù)據(jù)庫Neo4j介紹
1.1 什么是圖數(shù)據(jù)庫(graph database)
? 隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實(shí)社會織起了了一張龐大而復(fù)雜的關(guān)系網(wǎng),傳統(tǒng)數(shù)據(jù)庫很難處理關(guān)系運(yùn)算。大數(shù)據(jù)行業(yè)需要處理的數(shù)據(jù)之間的關(guān)系隨數(shù)據(jù)量呈幾何級數(shù)增長,急需一種支持海量復(fù)雜數(shù)據(jù)關(guān)系運(yùn)算的數(shù)據(jù)庫,圖數(shù)據(jù)庫應(yīng)運(yùn)而生。
? 世界上很多著名的公司都在使用圖數(shù)據(jù)庫,比如:
-
社交領(lǐng)域:Facebook, Twitter,Linkedin用它來管理社交關(guān)系,實(shí)現(xiàn)好友推薦
-
零售領(lǐng)域:eBay,沃爾瑪使用它實(shí)現(xiàn)商品實(shí)時推薦,給買家更好的購物體驗(yàn)
-
金融領(lǐng)域:摩根大通,花旗和瑞銀等銀行在用圖數(shù)據(jù)庫做風(fēng)控處理
-
汽車制造領(lǐng)域:沃爾沃,戴姆勒和豐田等頂級汽車制造商依靠圖數(shù)據(jù)庫推動創(chuàng)新制造解決方案
-
電信領(lǐng)域:Verizon, Orange和AT&T 等電信公司依靠圖數(shù)據(jù)庫來管理網(wǎng)絡(luò),控制訪問并支持客戶360
-
酒店領(lǐng)域:萬豪和雅高酒店等頂級酒店公司依使用圖數(shù)據(jù)庫來管理復(fù)雜且快速變化的庫存
圖數(shù)據(jù)庫并非指存儲圖片的數(shù)據(jù)庫,而是以圖數(shù)據(jù)結(jié)構(gòu)存儲和查詢數(shù)據(jù)。
圖數(shù)據(jù)庫是基于圖論實(shí)現(xiàn)的一種NoSQL數(shù)據(jù)庫,其數(shù)據(jù)存儲結(jié)構(gòu)和數(shù)據(jù)查詢方式都是以圖論為基礎(chǔ)的,圖數(shù)據(jù)庫主要用于存儲更多的連接數(shù)據(jù)。
圖論〔Graph Theory〕是數(shù)學(xué)的一個分支。它以圖為研究對象圖論中的圖是由若干給定的點(diǎn)及連接兩點(diǎn)的線所構(gòu)成的圖形,這種圖形通常用來描述某些事物之間的某種特定關(guān)系,用點(diǎn)代表事物,用連接兩點(diǎn)的線表示相應(yīng)兩個事物間具有這種關(guān)系。
使用 Google+(GooglePlus)應(yīng)用程序來了解現(xiàn)實(shí)世界中 Graph 數(shù)據(jù)庫的需求。 觀察下面的圖表。
在這里,我們用圓圈表示了Google+應(yīng)用個人資料
在上圖中,輪廓“A”具有圓圈以連接到其他輪廓:家庭圈(B,C,D)和朋友圈(B,C)。
再次,如果我們打開配置文件“B”,我們可以觀察以下鏈接的數(shù)據(jù)。
? 像這樣,這些應(yīng)用程序包含大量的結(jié)構(gòu)化,半結(jié)構(gòu)化和非結(jié)構(gòu)化的連接數(shù)據(jù)。 在 RDBMS 數(shù)據(jù)庫中表示這種非結(jié)構(gòu)化連接數(shù)據(jù)并不容易。如果我們在 RDBMS 數(shù)據(jù)庫中存儲這種更多連接的數(shù)據(jù),那么檢索或遍歷是非常困難和緩慢的。所以要表示或存儲這種更連接的數(shù)據(jù),我們應(yīng)該選擇一個流行的圖數(shù)據(jù)庫。
? 圖數(shù)據(jù)庫非常容易地存儲這種更多連接的數(shù)據(jù)。 它將每個配置文件數(shù)據(jù)作為節(jié)點(diǎn)存儲在內(nèi)部,它與相鄰節(jié)點(diǎn)連接的節(jié)點(diǎn),它們通過關(guān)系相互連接。他們存儲這種連接的數(shù)據(jù)與上面的圖表中的相同,這樣檢索或遍歷是非常容易和更快的。
關(guān)系查詢性能對比:
? 在數(shù)據(jù)關(guān)系中心,圖形數(shù)據(jù)庫在查詢速度方面非常高效,即使對于深度和復(fù)雜的查詢也是如此。在關(guān)系型數(shù)據(jù)庫和圖數(shù)據(jù)庫(Neo4j)之間進(jìn)行了實(shí)驗(yàn):在一個社交網(wǎng)絡(luò)里找到 大深度為5的朋友的朋友,他們的數(shù)據(jù)集包括100萬人,每人約有50個朋友。
實(shí)驗(yàn)結(jié)果如下:
對比關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫(RDBMS) | 圖數(shù)據(jù)庫 |
---|---|
表 | 圖 |
行 | 節(jié)點(diǎn) |
列和數(shù)據(jù) | 屬性和關(guān)系 |
約束 | 關(guān)系 |
在關(guān)系型數(shù)據(jù)庫中,Person和department之間用外鍵表示關(guān)系:
在圖數(shù)據(jù)庫中,節(jié)點(diǎn)和關(guān)系取代表,外鍵和join:
在圖數(shù)據(jù)庫中,無論何時運(yùn)行類似JOIN的操作,數(shù)據(jù)庫都會使用此列表并直接訪問連接的節(jié)點(diǎn),而無需進(jìn)行昂貴的搜索和匹配計(jì)算。
對比其他NoSQL數(shù)據(jù)庫:
NoSQL數(shù)據(jù)庫大致可以分為四類:
- 鍵值(key/value)數(shù)據(jù)庫
- 列存儲數(shù)據(jù)庫
- 文檔型數(shù)據(jù)庫
- 圖數(shù)據(jù)庫
1.2 什么是Neo4j
Neo4j是一個開源的NoSQL圖形數(shù)據(jù)庫,2003 年開始開發(fā),使用 scala和java 語言,2007年開始發(fā)布。
-
是世界上 先進(jìn)的圖數(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ù)導(dǎo)出到JSON和XLS格式
- 它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問
- 它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本
- 它支持兩種Java API:Cypher API和Native Java API來開發(fā)Java應(yīng)用程序
Neo4j的優(yōu)點(diǎn):
- 它很容易表示連接的數(shù)據(jù)
- 檢索/遍歷/導(dǎo)航更多的連接數(shù)據(jù)是非常容易和快速的
- 非常容易地表示半結(jié)構(gòu)化數(shù)據(jù)
- Neo4j CQL查詢語句命令是人性化的可讀格式,非常容易學(xué)習(xí)
- 使用簡單而強(qiáng)大的數(shù)據(jù)模型
- 不需要復(fù)雜的連接來檢索連接的/相關(guān)的數(shù)據(jù),因?yàn)樗苋菀讬z索它的相鄰節(jié)點(diǎn)或關(guān)系細(xì)節(jié)沒有連接或索引
1.3 Neo4j數(shù)據(jù)模型
圖論基礎(chǔ)
? 圖是一組節(jié)點(diǎn)和連接這些節(jié)點(diǎn)的關(guān)系,圖形以屬性的形式將數(shù)據(jù)存儲在節(jié)點(diǎn)和關(guān)系中,屬性是用于表示數(shù)據(jù)的鍵值對。
? 在圖論中,我們可以表示一個帶有圓的節(jié)點(diǎn),節(jié)點(diǎn)之間的關(guān)系用一個箭頭標(biāo)記表示。
? 簡單的可能圖是單個節(jié)點(diǎn):
我們可以使用節(jié)點(diǎn)表示社交網(wǎng)絡(luò)(如Google+(GooglePlus)個人資料),它不包含任何屬性。向Google+個人資料添加一些屬性:
在兩個節(jié)點(diǎn)之間建立關(guān)系:
此處在兩個配置文件之間創(chuàng)建關(guān)系名稱“跟隨”。 這意味著 Profile-I 遵循 Profile-II。
屬性圖模型
Neo4j圖數(shù)據(jù)庫遵循屬性圖模型來存儲和管理其數(shù)據(jù)。
屬性圖模型規(guī)則
- 表示節(jié)點(diǎn),關(guān)系和屬性中的數(shù)據(jù)
- 節(jié)點(diǎn)和關(guān)系都包含屬性
- 關(guān)系連接節(jié)點(diǎn)
- 屬性是鍵值對
- 節(jié)點(diǎn)用圓圈表示,關(guān)系用方向鍵表示。
- 關(guān)系具有方向:單向和雙向。
- 每個關(guān)系包含“開始節(jié)點(diǎn)”或“從節(jié)點(diǎn)”和“到節(jié)點(diǎn)”或“結(jié)束節(jié)點(diǎn)”
? 在屬性圖數(shù)據(jù)模型中,關(guān)系應(yīng)該是定向的。如果我們嘗試創(chuàng)建沒有方向的關(guān)系,那么它將拋出一個錯誤消息。在Neo4j中,關(guān)系也應(yīng)該是有方向性的。如果我們嘗試創(chuàng)建沒有方向的關(guān)系,那么Neo4j會拋出一個錯誤消息,“關(guān)系應(yīng)該是方向性的”。
? Neo4j圖數(shù)據(jù)庫將其所有數(shù)據(jù)存儲在節(jié)點(diǎn)和關(guān)系中,我們不需要任何額外的RDBMS數(shù)據(jù)庫或NoSQL數(shù)據(jù)庫來存儲Neo4j數(shù)據(jù)庫數(shù)據(jù),它以圖的形式存儲數(shù)據(jù)。Neo4j使用本機(jī)GPE(圖形處理引擎)來使用它的本機(jī)圖存儲格式。
圖數(shù)據(jù)庫數(shù)據(jù)模型的主要構(gòu)建模塊是:
- 節(jié)點(diǎn)
- 關(guān)系
- 屬性
簡單的屬性圖的例子:
這里我們使用圓圈表示節(jié)點(diǎn)。 使用箭頭表示關(guān)系,關(guān)系是有方向性的。 我們可以用Properties(鍵值對)來表示Node的數(shù)據(jù)。 在這個例子中,我們在Node的Circle中表示了每個Node的Id屬性。
1.4 Neo4j的構(gòu)建元素
Neo4j圖數(shù)據(jù)庫主要有以下構(gòu)建元素:
- 節(jié)點(diǎn)
- 屬性
- 關(guān)系
- 標(biāo)簽
- 數(shù)據(jù)瀏覽器
節(jié)點(diǎn)
節(jié)點(diǎn)(Node)是圖數(shù)據(jù)庫中的一個基本元素,用來表示一個實(shí)體記錄,就像關(guān)系數(shù)據(jù)庫中的一條記錄一 樣。在Neo4j中節(jié)點(diǎn)可以包含多個屬性(Property)和多個標(biāo)簽(Label)。
- 節(jié)點(diǎn)是主要的數(shù)據(jù)元素
- 節(jié)點(diǎn)通過關(guān)系連接到其他節(jié)點(diǎn)
- 節(jié)點(diǎn)可以具有一個或多個屬性(即,存儲為鍵/值對的屬性)
- 節(jié)點(diǎn)有一個或多個標(biāo)簽,用于描述其在圖表中的作用
屬性
屬性(Property)是用于描述圖節(jié)點(diǎn)和關(guān)系的鍵值對。其中Key是一個字符串,值可以通過使用任何 Neo4j數(shù)據(jù)類型來表示
- 屬性是命名值,其中名稱(或鍵)是字符串
- 屬性可以被索引和約束
- 可以從多個屬性創(chuàng)建復(fù)合索引
關(guān)系
關(guān)系(Relationship)同樣是圖數(shù)據(jù)庫的基本元素。當(dāng)數(shù)據(jù)庫中已經(jīng)存在節(jié)點(diǎn)后,需要將節(jié)點(diǎn)連接起來 構(gòu)成圖。關(guān)系就是用來連接兩個節(jié)點(diǎn),關(guān)系也稱為圖論的邊(Edge) ,其始端和末端都必須是節(jié)點(diǎn),關(guān)系不 能指向空也不能從空發(fā)起。關(guān)系和節(jié)點(diǎn)一樣可以包含多個屬性,但關(guān)系只能有一個類型(Type) 。
- 關(guān)系連接兩個節(jié)點(diǎn)
- 關(guān)系是方向性的
- 節(jié)點(diǎn)可以有多個甚至遞歸的關(guān)系
- 關(guān)系可以有一個或多個屬性(即存儲為鍵/值對的屬性)
基于方向性,Neo4j關(guān)系被分為兩種主要類型:
- 單向關(guān)系
- 雙向關(guān)系
標(biāo)簽
標(biāo)簽(Label)將一個公共名稱與一組節(jié)點(diǎn)或關(guān)系相關(guān)聯(lián), 節(jié)點(diǎn)或關(guān)系可以包含一個或多個標(biāo)簽。 我們 可以為現(xiàn)有節(jié)點(diǎn)或關(guān)系創(chuàng)建新標(biāo)簽, 我們可以從現(xiàn)有節(jié)點(diǎn)或關(guān)系中刪除標(biāo)簽。
- 標(biāo)簽用于將節(jié)點(diǎn)分組
- 一個節(jié)點(diǎn)可以具有多個標(biāo)簽
- 對標(biāo)簽進(jìn)行索引以加速在圖中查找節(jié)點(diǎn)
- 本機(jī)標(biāo)簽索引針對速度進(jìn)行了優(yōu)化
Neo4j 瀏覽器
一旦我們安裝Neo4j,我們就可以訪問Neo4j數(shù)據(jù)瀏覽器
訪問 http://192.168.65.200:7474/browser
1.5 使用場景
-
欺詐檢測
-
實(shí)時推薦引擎
2. 環(huán)境搭建
下載地址:https://neo4j.com/download-center/
安裝方式:
1、Neo4j Enterprise Server(企業(yè)版)
2、Neo4j Community Server(社區(qū)版)
3、Neo4j Desktop(桌面版)
以下為對應(yīng)的jdk1.8和neo4j的安裝包:
鏈接:https://pan.baidu.com/s/1ZjfP4JJC_QN21j-V_YejrA
提取碼:jfqq
安裝Neo4j圖型數(shù)據(jù)庫步驟:
1.安裝jdk1.8
2.安裝好jdk后,再安裝neo4j
下載好neo4j后,解壓完后,配置環(huán)境變量:
添加NEO4J_HOME系統(tǒng)變量
添加path變量
%NEO4J_HOME%\bin
配置好所有環(huán)境變量后,測試一下:
win+r打開運(yùn)行,在cmd中輸入:
neo4j.bat console
啟動后輸入Http://localhost:7474 ,訪問neo4j,默認(rèn)賬號和密碼都為neo4j
2.1安裝Neo4j Community Server
注意: neo4j最新版對應(yīng)的java版本是jdk17
jdk8可以下載Neo4j Community Edition 3.5.28
文檔:https://neo4j.com/docs/operations-manual/3.5/
解壓到新目錄(注意:目錄名稱不要有中文),比如: D:\neo4j\
# 將Neo4j作為控制臺應(yīng)用程序運(yùn)行
<NEO4J_HOME>\bin\neo4j console
# 將Neo4j作為服務(wù)使用進(jìn)行安裝
<NEO4J_HOME>\bin\neo4j install-service
console: 直接啟動 neo4j 服務(wù)器
install-service | uninstall-service | update-service : 安裝/卸載/更新 neo4j 服務(wù)
start/stop/restart/status: 啟動/停止/重啟/狀態(tài)
-V 輸出更多信息
進(jìn)入到bin目錄,執(zhí)行
neo4j console
在瀏覽器中訪問http://localhost:7474
使用用戶名neo4j和默認(rèn)密碼neo4j進(jìn)行連接,然后會提示更改密碼。
Neo4j Browser是開發(fā)人員用來探索Neo4j數(shù)據(jù)庫、執(zhí)行Cypher查詢并以表格或圖形形式查看結(jié)果的工 具。
3. Neo4j --CQL使用
3.1 Neo4j -- CQL簡介
Neo4j的Cypher語言是為處理圖形數(shù)據(jù)而構(gòu)建的,CQL代表Cypher查詢語言。像Oracle數(shù)據(jù)庫具有查詢語言SQL,Neo4j具有CQL作為查詢語言。
- 它是Neo4j圖形數(shù)據(jù)庫的查詢語言。
- 它是一種聲明性模式匹配語言
- 它遵循SQL語法。
- 它的語法是非常簡單且人性化、可讀的格式。
三個共同朋友的社交圖:
使用Cypher語言來描述關(guān)系:
(fox)<-[:knows]-(周瑜)-[:knows]->(諸葛)-[:knows]->(fox)
3.2 CQL命令使用一
CQL命令官方文檔:https://neo4j.com/docs/cypher-manual/3.5/clauses/match/
LOAD CSV
導(dǎo)入csv到neo4j
#將csv文件拷貝到 %NEO4J_HOME%\import目錄
load csv from 'file:///西游記,csv' as line
create (:西游{name:line[0],tail:line[1],label:line[3]})
CREATE 創(chuàng)建
create語句是創(chuàng)建模型語句用來創(chuàng)建數(shù)據(jù)模型
創(chuàng)建節(jié)點(diǎn)
#創(chuàng)建簡單節(jié)點(diǎn)
create (n)
#創(chuàng)建多個節(jié)點(diǎn)
create (n),(m)
#創(chuàng)建帶標(biāo)簽和屬性的節(jié)點(diǎn)并返回節(jié)點(diǎn)
create (n:person {name:'如來'}) return n
創(chuàng)建關(guān)系
Neo4j圖數(shù)據(jù)庫遵循屬性圖模型來存儲和管理其數(shù)據(jù)。
根據(jù)屬性圖模型,關(guān)系應(yīng)該是定向的。 否則,Neo4j將拋出一個錯誤消息。
基于方向性,Neo4j關(guān)系被分為兩種主要類型。
- 單向關(guān)系
- 雙向關(guān)系
#使用新節(jié)點(diǎn)創(chuàng)建關(guān)系
CREATE (n:person {name:'楊戩'})-[r:師傅]->(m:person {name:'玉鼎真人'}) return
type(r)
#使用已知節(jié)點(diǎn)創(chuàng)建帶屬性的關(guān)系
match (n:person {name:'沙僧'}),(m:person{name:'唐僧'})
create (n)-[r:`師傅`{relation:'師傅'}]->(m) return r
#檢索關(guān)系節(jié)點(diǎn)的詳細(xì)信息
match (n:person)-[r]-(m:person) return n,m
創(chuàng)建全路徑
create p=(:person{name:'蛟魔王'})-[:義兄]->(:person{name:'牛魔王'})<-[:義兄]-
(:person {name:'鵬魔王'}) return p
MATCH 查詢
Neo4j CQL MATCH命令用于
- 從數(shù)據(jù)庫獲取有關(guān)節(jié)點(diǎn)和屬性的數(shù)據(jù)
- 從數(shù)據(jù)庫獲取有關(guān)節(jié)點(diǎn),關(guān)系和屬性的數(shù)據(jù)
MATCH (n:`西游`) RETURN n LIMIT 25
RETURN返回
Neo4j CQL RETURN子句用于
- 檢索節(jié)點(diǎn)的某些屬性
- 檢索節(jié)點(diǎn)的所有屬性
- 檢索節(jié)點(diǎn)和關(guān)聯(lián)關(guān)系的某些屬性
- 檢索節(jié)點(diǎn)和關(guān)聯(lián)關(guān)系的所有屬性
MATCH (n:`西游`) RETURN id(n),n.name,n.tail,n.relation
WHERE子句
像SQL一樣,Neo4j CQL在CQL MATCH命令中提供了WHERE子句來過濾MATCH查詢的結(jié)果。
MATCH (n:person) where n.name='孫悟空' or n.name='豬八戒' RETURN n
#創(chuàng)建關(guān)系
match (n:person),(m:person) where n.name='孫悟空' and m.name='豬八戒'
create (n)-[r:師弟]->(m) return n.name,type(r),m.name
DELETE刪除
Neo4j使用CQL DELETE子句
- 刪除節(jié)點(diǎn)。
- 刪除節(jié)點(diǎn)及相關(guān)節(jié)點(diǎn)和關(guān)系。
# 刪除節(jié)點(diǎn) (前提:節(jié)點(diǎn)不存在關(guān)系)
MATCH (n:person{name:"白龍馬"}) delete n
# 刪除關(guān)系
MATCH (n:person{name:"沙僧"})<-[r]-(m) delete r return type(r)
REMOVE刪除
有時基于客戶端要求,我們需要向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加或刪除屬性。我們使用Neo4j CQL REMOVE子句 來刪除節(jié)點(diǎn)或關(guān)系的現(xiàn)有屬性。
- 刪除節(jié)點(diǎn)或關(guān)系的標(biāo)簽
- 刪除節(jié)點(diǎn)或關(guān)系的屬性
#刪除屬性
MATCH (n:role {name:"fox"}) remove n.age return n
#創(chuàng)建節(jié)點(diǎn)
CREATE (m:role:person {name:"fox666"}) #m:role:person 可以給“fox666”既創(chuàng)建role節(jié)點(diǎn)又創(chuàng)建person節(jié)點(diǎn)
#刪除標(biāo)簽
match (m:role:person {name:"fox666"}) remove m:person return m
SET子句
有時,根據(jù)我們的客戶端要求,我們需要向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加新屬性。要做到這一點(diǎn),Neo4j CQL提 供了一個SET子句。
- 向現(xiàn)有節(jié)點(diǎn)或關(guān)系添加新屬性
- 添加或更新屬性值
MATCH (n:role {name:"fox"}) set n.age=32 return n
ORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對MATCH查詢返回的結(jié)果進(jìn)行排序。
我們可以按升序或降序?qū)π羞M(jìn)行排序。默認(rèn)情況下,它按升序?qū)π羞M(jìn)行排序。 如果我們要按降序?qū)λ鼈?進(jìn)行排序,我們需要使用DESC子句。
MATCH (n:`西游`) RETURN id(n),n.name order by id(n) desc
UNION子句
與SQL一樣,Neo4j CQL有兩個子句,將兩個不同的結(jié)果合并成一組結(jié)果
-
UNION
它將兩組結(jié)果中的公共行組合并返回到一組結(jié)果中。 它不從兩個節(jié)點(diǎn)返回重復(fù)的行。
限制:
? 結(jié)果列類型和來自兩組結(jié)果的名稱必須匹配,這意味著列名稱應(yīng)該相同,列的數(shù)據(jù)類型應(yīng)該相同。
-
UNION ALL
它結(jié)合并返回兩個結(jié)果集的所有行成一個單一的結(jié)果集。它還返回由兩個節(jié)點(diǎn)重復(fù)行。
限制:
? 結(jié)果列類型,并從兩個結(jié)果集的名字必須匹配,這意味著列名稱應(yīng)該是相同的,列的數(shù)據(jù)類型應(yīng)該是相同的。
MATCH (n:role) RETURN n.name as name
UNION
MATCH (m:person) RETURN m.name as name
MATCH (n:role) RETURN n.name as name
UNION all
MATCH (m:person) RETURN m.name as name
LIMIT和SKIP子句
Neo4j CQL已提供 LIMIT
子句和SKIP
來過濾或限制查詢返回的行數(shù)。
LIMIT返回前幾行,SKIP忽略前幾行。
# 前兩行
MATCH (n:`西游`) RETURN n LIMIT 2
# 忽略前兩行
MATCH (n:person) RETURN n SKIP 2
NULL值
Neo4j CQL將空值視為對節(jié)點(diǎn)或關(guān)系的屬性的缺失值或未定義值。
當(dāng)我們創(chuàng)建一個具有現(xiàn)有節(jié)點(diǎn)標(biāo)簽名稱但未指定其屬性值的節(jié)點(diǎn)時,它將創(chuàng)建一個具有NULL屬性值的新 節(jié)點(diǎn)。
match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label
IN操作符
與SQL一樣,Neo4j CQL提供了一個IN運(yùn)算符,以便為CQL命令提供值的集合。
match (n:`西游`) where n.name in['孫悟空','唐僧'] return id(n),n.name,n.tail,n.label
INDEX索引
Neo4j SQL支持節(jié)點(diǎn)或關(guān)系屬性上的索引,以提高應(yīng)用程序的性能。
我們可以為具有相同標(biāo)簽名稱的所有節(jié)點(diǎn)的屬性創(chuàng)建索引。
我們可以在MATCH或WHERE或IN運(yùn)算符上使用這些索引列來改進(jìn)CQL Command的執(zhí)行。
Neo4J索引操作
- Create Index 創(chuàng)建索引
- Drop Index 丟棄索引
# 創(chuàng)建索引
create index on :`西游` (name)
# 刪除索引
drop index on :`西游` (name)
UNIQUE約束
在Neo4j數(shù)據(jù)庫中,CQL CREATE命令始終創(chuàng)建新的節(jié)點(diǎn)或關(guān)系,這意味著即使您使用相同的值,它也會 插入一個新行。 根據(jù)我們對某些節(jié)點(diǎn)或關(guān)系的應(yīng)用需求,我們必須避免這種重復(fù)。
像SQL一樣,Neo4j數(shù)據(jù)庫也支持對NODE或Relationship的屬性的UNIQUE約束
UNIQUE約束的優(yōu)點(diǎn)
- 避免重復(fù)記錄。 強(qiáng)
- 制執(zhí)行數(shù)據(jù)完整性規(guī)則
#創(chuàng)建唯一約束
create constraint on (n:xiyou) assert n.name is unique
#刪除唯一約束
drop constraint on (n:xiyou) assert n.name is unique
DISTINCT
這個函數(shù)的用法就像SQL中的distinct關(guān)鍵字,返回的是所有不同值。
match (n:`西游`) return distinct(n.name)
3.3 常用函數(shù)
函數(shù) | 用法 |
---|---|
String 字符串 | 它們用于使用String字面量 |
Aggregation 聚合 | 它們用于對CQL查詢結(jié)果執(zhí)行一些聚合操作 |
Relationship 關(guān)系 | 他們用于獲取關(guān)系的細(xì)節(jié),如startnode,endnode等 |
字符串函數(shù)
與SQL一樣,Neo4J CQL提供了一組String函數(shù),用于在CQL查詢中獲取所需的結(jié)果。
功能 | 描述 |
---|---|
UPPER | 它用于將所有字母更改為大寫字母 |
LOWER | 它用于將所有字母改為小寫字母 |
SUBSTRING | 它用于獲取給定String的子字符串 |
REPLACE | 它用于替換一個字符串的子字符串 |
MATCH (e) RETURN id(e),e.name,substring(e.name,0,2)
AGGREGATION聚合
和SQL一樣,Neo4j CQL提供了一些在RETURN子句中使用的聚合函數(shù)。 它類似于SQL中的GROUP BY 子句。
我們可以使用MATCH命令中的RETURN +聚合函數(shù)來處理一組節(jié)點(diǎn)并返回一些聚合值。
聚集功能 | 描述 |
---|---|
COUNT | 它返回由MATCH命令返回的行數(shù) |
MAX | 它從MATCH命令返回的一組行返回最大值 |
MIN | 它返回由MATCH命令返回的一組行的最小值 |
SUM | 它返回由MATCH命令返回的所有行的求和值 |
AVG | 它返回由MATCH命令返回的所有行的平均值 |
MATCH (e) RETURN count(e)
關(guān)系函數(shù)
Neo4j CQL提供了一組關(guān)系函數(shù),以在獲取開始節(jié)點(diǎn),結(jié)束節(jié)點(diǎn)等細(xì)節(jié)時知道關(guān)系的細(xì)節(jié)。
功能 | 描述 |
---|---|
STARTNODE | 它用于知道關(guān)系的開始節(jié)點(diǎn) |
ENDNODE | 它用于知道關(guān)系的結(jié)束節(jié)點(diǎn) |
ID | 它用于知道關(guān)系的ID |
TYPE | 它用于知道字符串表示中的一個關(guān)系的TYPE |
match (a)-[r] ->(b) return id(r),type(r)
3.4 neo4j-admin使用(數(shù)據(jù)庫備份、恢復(fù))
數(shù)據(jù)庫備份
對Neo4j數(shù)據(jù)進(jìn)行備份、還原、遷移的操作時,要關(guān)閉neo4j
cd %NEO4J_HOME%/bin
#關(guān)閉neo4j
neo4j stop #一定要先neo4j install -service,才可以執(zhí)行neo4j stop
#備份
neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump
數(shù)據(jù)庫恢復(fù)
還原、遷移之前 ,要關(guān)閉neo4j服務(wù)。
#數(shù)據(jù)導(dǎo)入
neo4j-admin load --from=/neo4j/backup/graph_backup.dump --database=graph.db --
force
#重啟服務(wù)
neo4j start
4.案例
4.1創(chuàng)建股票知識圖譜
創(chuàng)建一個簡單的股票知識圖譜,包括:
創(chuàng)建節(jié)點(diǎn)和關(guān)系:
1,建立幾只股票的節(jié)點(diǎn)
create(n:stock{name:'招商銀行',code:'600036',launchDate:date("2002-04-09")}),(:stock{name:'中科創(chuàng)達(dá)',code:'300496',launchDate:date("2015-12-10")}),(:stock{name:'華工科技',code:'000988',launchDate:date("2000-06-08")}),(:stock{name:'國信證券',code:'002736',launchDate:date("2014-12-29")})
2,建立上海證券交易所和深圳證券交易所兩個節(jié)點(diǎn)
create(n:SecuritiesExchange{name:'上海證券交易所'}),(:SecuritiesExchange{name:'深圳證券交易所'}) return n;
3,建立省市地方名稱的節(jié)點(diǎn)
create(n:Province{name:'湖北'}),(:Province{name:'北京'}),(:Province{name:'廣東'}) return n;
4,建立股票和證券交易所關(guān)系
#建立'國信證券'和'上海證券交易所'的關(guān)系
match(a:stock),(b:SecuritiesExchange) where a.name='國信證券' and b.name='上海證券交易所' create (a)-[r:Exchange]->(b) return r;
#建立'招商銀行'和'上海證券交易所'的關(guān)系
match(a:stock),(b:SecuritiesExchange) where a.name='招商銀行' and b.name='上海證券交易所' create (a)-[r:Exchange]->(b) return r;
#建立'華工科技'和'深圳證券交易所'的關(guān)系
match(a:stock),(b:SecuritiesExchange) where a.name='華工科技' and b.name='深圳證券交易所' create (a)-[r:Exchange]->(b)
#建立'華工科技'和'深圳證券交易所'的關(guān)系
match(a:stock),(b:SecuritiesExchange) where a.name='華工科技' and b.name='深圳證券交易所' create (a)-[r:Exchange]->(b)
5,建立股票和省市名稱關(guān)系
#建立'華工科技'和'北京'的關(guān)系
match(a:stock),(b:Province) where a.name='華工科技' and b.name='北京' create (a)-[r:Area]->(b)
#建立'中科創(chuàng)達(dá)'和'北京'的關(guān)系
match(a:stock),(b:Province) where a.name='中科創(chuàng)達(dá)' and b.name='北京' create (a)-[r:Area]->(b)
#建立'招商銀行'和'湖北'的關(guān)系
match(a:stock),(b:Province) where a.name='招商銀行' and b.name='湖北' create (a)-[r:Area]->(b)
#建立'國信證券'和'廣東'的關(guān)系
match(a:stock),(b:Province) where a.name='國信證券' and b.name='廣東' create (a)-[r:Area]->(b)
#建立'中科創(chuàng)達(dá)'和'國信證券'的關(guān)系
create (n:stock{name:'中科創(chuàng)達(dá)'})-[r:同行]->(:stock{name:'國信證券'}) return r
#建立'華工科技'和'中科創(chuàng)達(dá)'為同行的關(guān)系
match(a:stock{name:'華工科技'}),(b:stock{name:'中科創(chuàng)達(dá)'}) create (a)-[r:`同行`{relation:'同行'}]->(b) return type(r)
#建立'華工科技'和'招商銀行'為同行的關(guān)系
match(a:stock{name:'華工科技'}),(b:stock{name:'招商銀行'}) create (a)-[r:同行]->(b) return type(r)
查詢節(jié)點(diǎn)和關(guān)系:
6,查詢某個股票的節(jié)點(diǎn)
#查詢'招商銀行'股票節(jié)點(diǎn)
match (a:stock) where a.name='招商銀行' return a;
7,查詢某個標(biāo)簽的所有節(jié)點(diǎn)
#查詢‘stock’標(biāo)簽的所有節(jié)點(diǎn)
match(a:stock) return a;
8.查詢兩個節(jié)點(diǎn)之間的關(guān)系
#查詢‘華工科技’和‘北京’之間的關(guān)系
match(:stock{name:'華工科技'})-[r]->(:Province{name:'北京'}) return type(r)
返回結(jié)果:type(r) "Area"
9,通過函數(shù)type獲取關(guān)系的類型
match(:stock{name:'華工科技'})-[r]->() return type(r);
返回結(jié)果:type(r) "Area" "Exchange"
刪除節(jié)點(diǎn)和關(guān)系
10,刪除股票的節(jié)點(diǎn)
#如果該節(jié)點(diǎn)存在關(guān)系,先刪關(guān)系,再刪節(jié)點(diǎn)。
match(a:stock) where a.name='中科創(chuàng)達(dá)' delete a
11,刪除某個標(biāo)簽的節(jié)點(diǎn)
#刪除‘stock’標(biāo)簽的節(jié)點(diǎn)
match(n:stock) delete n
#刪除所有標(biāo)簽節(jié)點(diǎn)
match(n) delete n
12,刪除兩個節(jié)點(diǎn)的關(guān)系
#刪除'中科創(chuàng)達(dá)'和'國信證券'之間的關(guān)系
match(:stock{name:'中科創(chuàng)達(dá)'})-[r]->(:stock{name:'國信證券'}) delete r
#刪除'中科創(chuàng)達(dá)'節(jié)點(diǎn)之間的關(guān)系
match(:stock{name:'中科創(chuàng)達(dá)'})-[r]->() delete r
13,刪除全部關(guān)系
#刪除'stock'標(biāo)簽的全部關(guān)系
match(:stock)-[r]->() delete r
更新圖形
set子句,用于對更新節(jié)點(diǎn)的標(biāo)簽和實(shí)體的屬性;remove子句,用于刪除實(shí)體的屬性和節(jié)點(diǎn)的標(biāo)簽;
14,增加節(jié)點(diǎn)屬性文章來源:http://www.zghlxwxcb.cn/news/detail-819375.html
#增加'湖北'節(jié)點(diǎn)的屬性
match(a:Province) where a.name='湖北' set a.abbreviation='HN' return a
match(a:Province) where a.name='湖北' set a.person='2000' return a
15,刪除節(jié)點(diǎn)屬性文章來源地址http://www.zghlxwxcb.cn/news/detail-819375.html
#刪除‘湖北’節(jié)點(diǎn)屬性
match(a:Province) where a.name='湖北' remove a.person
4.2 利用CQL構(gòu)建明星關(guān)系圖譜
#導(dǎo)入明星數(shù)據(jù)
load csv from 'file:///明星1.csv' as line
create (:star {num:line[0],name:line[1]})
load csv from 'file:///明星關(guān)系數(shù)據(jù)1.csv' as line
create (:starRelation
{from:line[0],subject:line[1],to:line[2],object:line[3],relation:line[4]})
#查詢明星關(guān)系
match (n:star),(m:starRelation),(s:star) where n.name='劉燁' and m.subject='劉燁'
and s.name=m.object
return n.name,m.relation,s.name
# 創(chuàng)建關(guān)系 構(gòu)建明星關(guān)系圖譜
match (n:star),(m:starRelation),(s:star) where n.name='劉燁' and m.subject='劉燁'
and s.name=m.object
create (n)-[r:關(guān)系{relation:m.relation}]->(s)
return n.name,m.relation,s.name
#查看明星關(guān)系
MATCH p=(n:star{name:'劉燁'})-[r:`關(guān)系`]->() RETURN p
# 構(gòu)建明星全部關(guān)系圖譜
match (n:star1),(m:starRelation),(s:star1) where n.name=m.subject and s.name=m.object
create (n)-[r:明星關(guān)系{relation:m.relation}]->(s)
# return n.name,m.relation,s.name (可以不寫也)
到了這里,關(guān)于圖數(shù)據(jù)庫Neo4j(最詳細(xì)教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!