隨著互聯(lián)網(wǎng)不斷的發(fā)展园爷,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫如oracle宠蚂,mysql已經(jīng)難以支撐現(xiàn)下大數(shù)據(jù)量,高并發(fā)的場景了童社。于是求厕,NoSQL橫空出世,有像cassandra這樣的column-based叠洗,像MongoDB這樣document-based甘改。今天在這里獵奇的是一個graph-based的數(shù)據(jù)庫,Neo4j灭抑。
什么是圖數(shù)據(jù)庫
圖數(shù)據(jù)庫名字的由來其實與其在底層的存儲方式有關(guān)十艾,Neo4j底層會以圖的方式把用戶定義的節(jié)點以及關(guān)系存儲起來,通過這種方式腾节,可是高效的實現(xiàn)從某個節(jié)點開始忘嫉,通過節(jié)點與節(jié)點間關(guān)系,找出兩個節(jié)點間的聯(lián)系案腺。
從這段描述中可以猜得到庆冕,在Neo4j中最重要的兩個元素就是節(jié)點和關(guān)系。說到節(jié)點和關(guān)系劈榨,就必須引出一個非常重要的概念访递,屬性圖模型(Property Graph Model)。如下所示:
- 一個圖中會記錄節(jié)點和關(guān)系
- 關(guān)系可以用來關(guān)聯(lián)兩個節(jié)點
- 節(jié)點和關(guān)系都可以擁有自己的屬性
- 可以賦予節(jié)點多個標簽(類別)
接下來用一個實際的例子來解釋下這個模型同辣,最近在虎撲上被吹捧的特別厲害的恩比德大帝曾經(jīng)爆出過他自己PS的一張圖拷姿,隔空示愛蕾哈娜,參考下圖
我們嘗試用Property Graph Model來表示這樣的一個關(guān)系旱函。
上圖中定義了兩個節(jié)點响巢,恩比德和蕾哈娜,類別分別是球員和歌手棒妨,分別擁有身高踪古,國籍以及生日,血型屬性。兩個節(jié)點之間通過一個“喜歡”關(guān)系關(guān)聯(lián)伏穆,“喜歡”關(guān)系擁有自己的一個屬性“自從”拘泞,屬性值為2014年。
Neo4j數(shù)據(jù)庫的優(yōu)勢
- 在創(chuàng)建節(jié)點的時候就已經(jīng)把關(guān)系給建立起來蜈出,避免了在復雜查詢場景下的處理
- 由于底層直接以圖的形式存儲節(jié)點和關(guān)系田弥,在查詢的時候可以使時間復雜度保持在常數(shù)級別。
- 基于JVM實現(xiàn)
- 提供一套易于理解的查詢語言Cypher以及內(nèi)置的可視化UI
- 很好的支持ACID铡原,有事務機制
Neo4j安裝及實踐
為了方便大家搭建環(huán)境偷厦,本文還是會用Docker來運行一個包含Neo4j的容器,Docker下載安裝參考這里燕刻。在下文中會根據(jù)之前引用的恩比德大帝的例子來介紹Cypher語句只泼。
從Docker Hub上pull一個Neo4j的鏡像
docker pull neo4j
啟動一個Neo4j的容器, 需要在你的Home目錄下建立一個/neo4j/data文件夾
docker run --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data neo4j
在瀏覽器中訪問loalhost:7474可以看到如下的UI界面,輸入默認用戶名和密碼neo4j即可連接到neo4j數(shù)據(jù)庫卵洗。
創(chuàng)建一個球員節(jié)點恩比德
CREATE (embiid: PLAYER {name: 'Embiid', height: '2.13m', nationality: 'Cameroon'})
可以通過點擊Neo4j左邊的側(cè)邊欄中的PLAYER標簽看到剛才新建的節(jié)點请唱。
創(chuàng)建歌手蕾哈娜節(jié)點以及“喜歡”關(guān)系
MATCH (embiid:PLAYER{name:'Embiid'})
MERGE (embiid)-[:LIKES{since:'2014'}]->(Rihanna: SINGER{name:'Rihanna', dob:'1988/2/20',bloodType:'O'})
創(chuàng)建完以后UI如下圖所示,圖中可以看出新建的蕾哈娜節(jié)點和之前的恩比德節(jié)點通過LIKES關(guān)系關(guān)聯(lián)了起來
查詢返回所有喜歡蕾哈娜的PLAYER節(jié)點
MATCH(p:PLAYER)-[:LIKES]->(:SINGER{name:'Rihanna'})
RETURN p;
Neo4j常用使用場景
- 社交網(wǎng)絡(luò)
- 基于圖的搜索
- 推薦引擎
- 企業(yè)基礎(chǔ)設(shè)施及網(wǎng)絡(luò)架構(gòu)
- 等等等
結(jié)語:
本文簡單扼要的介紹了Neo4j這個比較小眾的數(shù)據(jù)庫的概念和使用方法过蹂,相信在這個數(shù)據(jù)為王的時代十绑,圖數(shù)據(jù)庫可以從其它各類數(shù)據(jù)庫中脫穎而出,獲得一席之地酷勺。