1. 程式人生 > 實用技巧 >圖資料庫 — neo4j (一)

圖資料庫 — neo4j (一)

圖資料庫 — neo4j (一)

隨著社交、電商、金融、零售、物聯網等行業的快速發展,現實社會織起了了一張龐大而複雜的關係網,傳統資料庫很難處理關係運算。大資料行業需要處理的資料之間的關係隨資料量呈幾何級數增長,急需一種支援海量複雜資料關係運算的資料庫,圖資料庫應運而生。

世界上很多著名的公司都在使用圖資料庫。比如:

  • 社交領域:Facebook, Twitter用它來管理社交關係,實現好友推薦。

  • 零售領域:eBay,沃爾瑪使用它實現商品實時推薦,給買家更好的購物體驗。

  • 金融領域:摩根大通,花旗和瑞銀等銀行在用圖資料庫做風控處理。

  • 汽車製造領域:沃爾沃,戴姆勒和豐田等頂級汽車製造商依靠圖資料庫推動創新制造解決方案。

  • 電信領域:Verizon, Orange等電信公司依靠圖資料庫來管理網路,控制訪問並支援客戶360。

  • 酒店領域:萬豪和雅高酒店等頂級酒店公司依使用圖資料庫來管理複雜且快速變化的庫存。

1、什麼是圖資料庫?

圖資料庫(Graph database)並非指儲存圖片的資料庫,而是以這種資料結構儲存和查詢資料。

圖資料庫是一種線上資料庫管理系統,具有處理圖形資料模型的建立,讀取,更新和刪除(CRUD)操作。

與其他資料庫不同,關係在圖資料庫中佔首要地位。這意味著應用程式不必使用外來鍵或帶外處理(如MapReduce)來推斷資料連線。

與關係資料庫或其他NoSQL資料庫相比,圖資料庫的資料模型也更加簡單,更具表現力。

圖形資料庫是為與事務(OLTP)系統一起使用而構建的,並且在設計時考慮了事務完整性和操作可用性。

2、基於圖結構的儲存

  • 將實體看做節點,關係看做帶有標籤的邊,那麼知識圖譜的資料很自然地滿足圖模型結構。

  • 圖資料庫基於有向圖,其理論基礎是圖論。節點、邊和屬性是圖資料庫的核心概念。

    • 節點:節點用於表示實體、事件等物件,可以類比於關係資料庫中的記錄或資料表中的行資料。例如人物、地點、電影等都可以作為圖中的節點。

    • 邊(關係):邊是指圖中連線節點的有向線條,用於表示不同節點之間的關係。例如人物節點之間的夫妻關係、同事關係等都可以作為圖中的邊。

    • 屬性:屬性用於描述節點或者邊的特性。例如人物的姓名、夫妻關係的起止時間等都是屬性。

3、常見的圖資料儲存系統

  • Neo4j: Neo4j是一個開源的圖資料庫系統,它將結構化的資料儲存在圖上而不是表中。Neo4j基於Java實現,是一個具備完全事務特性的高效能資料庫,具有成熟資料庫的所有特性。Neo4j是一個本地資料庫,不需要啟動資料庫伺服器,應用程式不用通過網路訪問資料庫服務,訪問速度快。https://neo4j.com/

  • OrientDB:是一個開源的文件-圖混合資料庫,兼具圖資料庫對資料強大的表示及組織能力和文件資料庫的靈活性及很好的可擴充套件性。該資料庫同樣是本地的,支援許多資料庫的高階特性,如事務、快速索引、SQL查詢等。http://orientdb.com/

  • HyperGraphDB:同樣是開源的儲存系統,並依託於BerkeleyDB資料庫,最大的特點是超圖,從數學角度講,有向圖的一條邊只能指向一個節點,而超圖則可以指向多個節點,HyperGraphDB還允許一條邊指向其它邊,因此有更強大的表示能力。http://www.hypergraphdb.org/

  • InfiniteGraph:一個基於Java語言開發的分散式圖資料庫系統。http://www.objectivity.com/ products/infinitegraph/

4、對比

4.1 與NoSQL資料庫對比

NoSQL資料庫大致可以分為四類:

  • 鍵值(key/value)資料庫
  • 列儲存資料庫
  • 文件型資料庫
  • 圖資料庫
分類資料模型優勢劣勢舉例
鍵值資料庫 雜湊表 查詢速度快 資料無結構化,通常只被當作字串或者二進位制資料 Redis
列儲存資料庫 列式資料儲存 查詢速度快;支援分佈橫向擴充套件;資料壓縮率高 功能相對受限 HBase
文件型資料庫 鍵值對擴充套件 資料結構要求不嚴格;表結構可變;不需要預先定義表結構 查詢效能不高,缺乏統一的查詢語法 MongoDB
圖資料庫 節點和關係組成的圖 利用圖結構相關演算法(最短路徑、節點度關係查詢等) 可能需要對整個圖做計算,不利於圖資料分佈儲存 Neo4j、JanusGraph

4.2 與關係型資料庫對比

關係型資料庫實際上是不擅長處理關係的。很多場景下,業務需求完全超出了當前的資料庫架構。

舉個栗子:假設某關係型資料庫中有這麼幾張使用者、訂單、商品表:

當我們要查詢:“使用者購買了那些商品?” 或者 “該商品有哪些客戶購買過?” 需要開發人員JOIN幾張表,效率非常低下。

而“購買該產品的客戶還購買了哪些商品?”類似的查詢幾乎不可能實現。

4.2.1 關係查詢效能對比
在資料關係中心,圖形資料庫在查詢速度方面非常高效,即使對於深度和複雜的查詢也是如此。在《Neo4j in Action》這本書中,作者在關係型資料庫和圖資料庫(Neo4j)之間進行了實驗。

他們的實驗試圖在一個社交網路裡找到最大深度為5的朋友的朋友。他們的資料集包括100萬人,每人約有50個朋友。實驗結果如下:

深度MySQL執行時間(s)Neo4J執行時間(s)返回記錄數
2 0.016 0.01 ~2500
3 30.267 0.168 ~110 000
4 1543.505 1.359 ~600 000
5 未完成 2.132 ~800 000

在深度為2時(即朋友的朋友),兩種資料庫效能相差不是很明顯;深度為3時(即朋友的朋友的朋友),很明顯,關係型資料庫的響應時間30s,已經變得不可接受了;深度到4時,關係資料庫需要近半個小時才能返回結果,使其無法應用於線上系統;深度到5時,關係型資料庫已經無法完成查詢。而對於圖資料庫Neo4J,深度從3到5,其響應時間均在3秒以內。

可以看出,對於圖資料庫來說,資料量越大,越複雜的關聯查詢,約有利於體現其優勢。從深度為4/5的查詢結果我們可以看出,圖資料庫返回了整個社交網路一半以上的人數。

5、Neo4J

根據DB-Engines(https://db-engines.com/en/ranking/graph+dbms)最新發布的圖資料庫排名,Neo4J仍然大幅領先排在第一位:

Neo4j是:

  • 一個開源

  • 無Schema

  • 沒有SQL

  • 圖形資料庫

圖形資料庫也稱為圖形資料庫管理系統或GDBMS。

Neo4j的官方網站:http://www.neo4j.org

Neo4J是由Java實現的開源圖資料庫。自2003年開始開發,直到2007年正式釋出第一版,並託管於GitHub上。

Neo4J支援ACID,叢集、備份和故障轉移。目前Neo4J最新版本為4.1,分為社群版和企業版,社群版只支援單機部署,功能受限。企業版支援主從複製和讀寫分離,包含視覺化管理工具。

5.1 標記屬性圖模型

(1)節點

  • 節點是主要的資料元素
  • 節點通過關係連線到其他節點
  • 節點可以具有一個或多個屬性(即,儲存為鍵/值對的屬性)
  • 節點有一個或多個標籤,用於描述其在圖表中的作用
  • 示例:人員節點與Car節點

(2)關係

  • 關係連線兩個節點
  • 關係是方向性的
  • 節點可以有多個甚至遞迴的關係
  • 關係可以有一個或多個屬性(即儲存為鍵/值對的屬性)

(3)屬性

  • 屬性是命名值,其中名稱(或鍵)是字串
  • 屬性可以被索引和約束
  • 可以從多個屬性建立複合索引

(4)標籤

  • 標籤用於將節點分組
  • 一個節點可以具有多個標籤
  • 對標籤進行索引以加速在圖中查詢節點
  • 本機標籤索引針對速度進行了優化

6、Cypher圖查詢語言

Cypher是Neo4j的圖形查詢語言,允許使用者儲存和檢索圖形資料庫中的資料。

舉例,我們要查詢Joe的所以二度好友:

查詢語句如下:

MATCH 
  (person:Person)-[:KNOWS]-(friend:Person)-[:KNOWS]-
  (foaf:Person)
WHERE 
  person.name = "Joe"
  AND NOT (person)-[:KNOWS]-(foaf)
RETURN
  foaf  

Joe認識Sally,Sally認識Anna。 Bob被排除在結果之外,因為除了通過Sally成為二級朋友之外,他還是一級朋友。

7、小結

圖資料庫應對的是當今一個巨集觀的商業世界的大趨勢:憑藉高度關聯、複雜的動態資料,獲得洞察力和競爭優勢。國內越來越多的公司開始進入圖資料庫領域,研發自己的圖資料庫系統。對於任何達到一定規模或價值的資料,圖資料庫都是呈現和查詢這些關係資料的最好方式。而理解和分析這些圖的能力將成為企業未來最核心的競爭力。