隨着互聯網不斷的發展,傳統的關系型數據庫如oracle,mysql已經難以支撐現下大數據量,高並發的場景了。於是,NoSQL橫空出世,有像cassandra這樣的column-based,像MongoDB這樣document-based。今天在這里獵奇的是一個graph-based的數據庫,Neo4j。
什么是圖數據庫
圖數據庫名字的由來其實與其在底層的存儲方式有關,Neo4j底層會以圖的方式把用戶定義的節點以及關系存儲起來,通過這種方式,可是高效的實現從某個節點開始,通過節點與節點間關系,找出兩個節點間的聯系。
從這段描述中可以猜得到,在Neo4j中最重要的兩個元素就是節點和關系。說到節點和關系,就必須引出一個非常重要的概念,屬性圖模型(Property Graph Model)。如下所示:

- 一個圖中會記錄節點和關系
- 關系可以用來關聯兩個節點
- 節點和關系都可以擁有自己的屬性
- 可以賦予節點多個標簽(類別)
接下來用一個實際的例子來解釋下這個模型,最近在虎撲上被吹捧的特別厲害的恩比德大帝曾經爆出過他自己PS的一張圖,隔空示愛蕾哈娜,參考下圖

我們嘗試用Property Graph Model來表示這樣的一個關系。

上圖中定義了兩個節點,恩比德和蕾哈娜,類別分別是球員和歌手,分別擁有身高,國籍以及生日,血型屬性。兩個節點之間通過一個“喜歡”關系關聯,“喜歡”關系擁有自己的一個屬性“自從”,屬性值為2014年。
Neo4j數據庫的優勢
- 在創建節點的時候就已經把關系給建立起來,避免了在復雜查詢場景下的處理
- 由於底層直接以圖的形式存儲節點和關系,在查詢的時候可以使時間復雜度保持在常數級別。
- 基於JVM實現
- 提供一套易於理解的查詢語言Cypher以及內置的可視化UI
- 很好的支持ACID,有事務機制
Neo4j安裝及實踐
為了方便大家搭建環境,本文還是會用Docker來運行一個包含Neo4j的容器,Docker下載安裝參考這里。在下文中會根據之前引用的恩比德大帝的例子來介紹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數據庫。

創建一個球員節點恩比德
CREATE (embiid: PLAYER {name: 'Embiid', height: '2.13m', nationality: 'Cameroon'})

可以通過點擊Neo4j左邊的側邊欄中的PLAYER標簽看到剛才新建的節點。

創建歌手蕾哈娜節點以及“喜歡”關系
MATCH (embiid:PLAYER{name:'Embiid'}) MERGE (embiid)-[:LIKES{since:'2014'}]->(Rihanna: SINGER{name:'Rihanna', dob:'1988/2/20',bloodType:'O'})

創建完以后UI如下圖所示,圖中可以看出新建的蕾哈娜節點和之前的恩比德節點通過LIKES關系關聯了起來

查詢返回所有喜歡蕾哈娜的PLAYER節點
MATCH(p:PLAYER)-[:LIKES]->(:SINGER{name:'Rihanna'}) RETURN p;


Neo4j常用使用場景
- 社交網絡
- 基於圖的搜索
- 推薦引擎
- 企業基礎設施及網絡架構
- 等等等
結語:
本文簡單扼要的介紹了Neo4j這個比較小眾的數據庫的概念和使用方法,相信在這個數據為王的時代,圖數據庫可以從其它各類數據庫中脫穎而出,獲得一席之地。
作者:BlairWaldorf
鏈接:https://www.jianshu.com/p/97c6752e928b
來源:簡書