Neo4j簡介

HOLD ON!發表於2020-09-26

Neo4j簡介

weixin_44304265

前言
隨著大資料時代的發展,誕生了一大批大資料時代下的新資料庫產品,如今MongoDB、Redis、HBase這些NoSQL資料庫已經成為了網際網路開發的新標配,SQL一統江湖的時代不復存在了。
然而,如果你覺得只要學習了上邊這幾種NoSQL你就抓住了大資料時代的話,你可就大錯特錯了!大資料時代發展速度之快超乎你的想象,新的資料庫產品仍然在不斷誕生,一些快速興起的小眾資料庫很有可能成為下一個MongoDB、HBase!為了不落後於時代,你還不抓緊時間瞭解一下?
本系列文章為大家挑選了幾種適合不同場景的小眾資料庫。這些資料庫儘管小眾,但是在它們自身擅長的場景中卻能夠發揮出遠大於大眾資料庫的作用。因此如果你的需求比較特殊,大眾資料庫產品無法很好的滿足你,那麼這些小眾資料庫沒準更適合你。
這次給大家介紹的是非常適合在社交網路、智慧推薦領域應用的圖資料庫Neo4j。
Neo4j初認識
Neo4j是現今最火爆的圖資料[1]。Neo4j最早在2010年釋出,背後的Neo4j公司在2016年完成了3600萬美金的D輪融資,產品的發展勢頭還算不錯。
作為圖資料庫,Neo4j最大的特點是關係資料的儲存。
估計大部分人壓根還不知道啥是圖資料庫。圖資料庫除了能夠像普通的資料庫一樣儲存一行一行的資料之外,還可以很方便的儲存資料之間的關係資訊。
例如,對於一個社交網路的使用者資料庫,你除了要儲存每個使用者的姓名、性別、喜好這些基本資訊外,你還需要儲存一個使用者和哪些使用者是朋友,和哪個使用者是情侶這些關係資料,這個時候Neo4j這樣的圖資料就可以派上用場啦!
通過下圖,大家可以瞭解下什麼是圖資料庫以及什麼是關係資料。
在這裡插入圖片描述

關係資料示例

在上圖中,包含兩個標籤為“人”的資料節點,分別代表Ann和Dan兩個使用者。這兩個資料節點還包含姓名、出生地等屬性資訊,用於表示兩個使用者的基本資訊,就如同常規資料庫中的兩行資料。
除此之外,兩個資料節點之間還包含兩條關係資料,即Ann嫁給了Dan,Ann和Dan同居。利用這些關係資料,你就可以方便的作出基於關係的查詢,例如你可以查詢Ann跟誰結婚了,這就是圖資料庫的優勢。
Neo4j的獨特優勢
可能有人會說,上邊寫的這種關係資料結構,SQL也可以通過多表join等方法實現,那要Neo4j還有什麼用?但畢竟術業有專攻,對於大量、複雜的關係資料處理,Neo4j在效能和使用方便程度上都是要遠勝於SQL的。下邊給大家簡單總結下Neo4j的優勢:

資料底層儲存專門針對圖資料的特點進行優化,在關係資料的處理上具備遠高於其他資料庫的效能
專門為關係資料設計的查詢語言,對於關係資料的操作更加的方便。
沒有表結構這個概念,相較SQL在使用上更加靈活。
自動為資料建立合適的索引(根據資料的標籤),免去管理索引的麻煩。
支援高可用性主從叢集部署。
具備圖形化平臺等配套工具,幫助開發者快速構建出完整的關係資料平臺。

Neo4j的使用場景

社交網路:根據使用者與其他使用者的關係為使用者推薦新的朋友。例如,在QQ中給你推薦朋友的朋友 。
智慧推薦引擎:通過分析使用者有哪些朋友、使用者朋友喜好的產品、使用者的瀏覽記錄等關係資訊推測使用者的喜好進而為使用者推薦商品。
知識圖譜:根據知識點之間的關係建立知識圖,幫助使用者搜尋到關聯的知識。例如,在百度上搜尋Neo4j,會同時出現MySQL等類似的內容。
惡意軟體檢測:通過記錄軟體行為的各種關係資料,例如其訪問了哪些IP、訪問了哪些系統資源,進而分析軟體行為是否具有惡意。
網路、資料中心管理:網路、資料中心這些基礎設施自身就是一個包含複雜關係的網路,利用Neo4j可以方便的建立裝置之間的關係,以便於對整個系統的管理。

Neo4j簡單體驗
Neo4j有一套自己的查詢語言,整體寫法和SQL非常類似,因此對習慣SQL的使用者非常友好。
例如,以下語句用於新建一個人型別的資料節點,這個人的姓名是Emil,來自Sweden。(以下教程摘自Neo4j官網[2],感興趣的同學可以到官網檢視詳細教程)
CREATE (ee:Person { name: “Emil”, from: “Sweden”, klout: 99 })

以下語句則用來建立另一個人,名字叫Johan,並且他和Emil從2001年開始認識。(ee)-[:KNOWS {since: 2001}]->(js) 這段語句就相當於是為Johan和Emil建立了一個關係資料。
MATCH (ee:Person) WHERE ee.name = “Emil”
CREATE (js:Person { name: “Johan”, from: “Sweden”, learn: “surfing” }),
(ee)-[:KNOWS {since: 2001}]->(js)

資料建立後,就可以開始見識Neo4j在關係資料處理方面的威力了。以下語句用於查詢Emil的所有朋友。(出於簡潔考慮省略掉了其他使用者資料的建立過程)
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = “Emil” RETURN ee, friends

在這裡插入圖片描述

Neo4j中的資料

上邊的圖是由Neo4j自帶的圖形化平臺生成的。這裡順帶介紹下Neo4j配套的圖形化平臺,真的是非常強大,能夠以圖形化的形式在Web中展示資料節點之間的關係,並且可以通過點選拖動等互動實現更加複雜的查詢操作。

Neo4j的圖形化平臺

以上只是Neo4j最簡單基本的使用介紹,Neo4j的功能還有很多,感興趣的同學可以自己去官網上了解。
Neo4j的侷限
Neo4j在關係資料的處理方面具備很強的效能和功能,但是為了實現這點,Neo4j也在其他方面做出了很多犧牲:

Neo4j對於關係資料以外的複雜查詢支援不佳,例如range、複雜聚合,更不用說SQL中的多表查詢了。
效能低於常規NoSQL。受限於圖資料的複雜性,Neo4j在效能上尤其是寫效能上明顯弱於MongoDB這類NoSQL,並且在效能水平擴充套件上也比較受限。
缺乏原生分片支援,容量水平擴充套件上比較受限。
因此,Neo4j僅僅適用於包含大量關係資料的場景中,如果你的資料模型並沒有包含太多關係結構,還是老老實實的用MySQL、MongoDB這些常規資料庫吧。

總結
綜上,Neo4j對關係資料具備非常強的處理能力,如果你有類似推薦引擎、社交網路這樣的關係資料應用場景,那就完全可以考慮嘗試一下。