帶你發現新大陸之圖資料庫解密

MYSQL輕鬆學發表於2020-11-10

​一、關係型資料庫的不適性

在眾多不同的資料模型裡,關係資料模型自20世紀80年代就處於統治地位,而且出現了不少巨頭,如Oracle、MySQL,它們也被稱為:關聯式資料庫管理系統(RDBMS)。然而,隨著關聯式資料庫使用範圍的不斷擴大,也暴露出一些它始終無法解決問題,其中最主要的是資料建模中的一些缺陷和問題,以及在大資料量和多伺服器之上進行水平伸縮的限制。同時,網際網路發展也產生了一些新的趨勢變化:

  1. 使用者、系統和感測器產生的資料量呈指數增長,資料量不斷增加,大資料的儲存和處理;

  2. 新時代網際網路形勢下的問題急迫性,這一問題因網際網路+、社交網路,智慧推薦等的大規模興起和繁榮而變得越加緊迫。

而在應對這些趨勢時,關聯式資料庫產生了更多的不適應性,從而導致大量解決這些問題中某些特定方面的不同技術出現,它們可以與現有RDBMS相互配合或代替它們。過去的幾年間,出現了大量新型資料庫,它們被統稱為NoSQL資料庫。

二、NoSQL資料庫的資料模型

NoSQL(Not Only SQL,不限於SQL)是一類範圍非常廣泛的持久化解決方案,它們不遵循關聯式資料庫模型,也不使用SQL作為查詢語言。其資料儲存可以不需要固定的表格模式,也經常會避免使用SQL的JOIN操作,一般有水平可擴充套件的特徵。

簡言之,NoSQL資料庫可以按照它們的資料模型分成4類:

  1. 鍵-值儲存庫(Key-Value-stores);

  2. BigTable實現(BigTable-implementations);

  3. 文件庫(Document-stores);

  4. 圖形資料庫(Graph Database);

在NoSQL四種分類中,圖資料庫從最近十年的表現來看已經成為關注度最高,也是發展趨勢最明顯的資料庫型別。下圖就是db-engines.com對最近三年來所有資料庫種類發展趨勢的分析結果:

看到這裡如果以前沒有對圖資料庫有所瞭解的話可能還是一頭霧水,圖資料庫到底是什麼東西!下邊我們首先通過一個小案例說一下使用圖資料的緊迫性!

三、新時期網際網路下什麼最重要?

新時期的網際網路下,對於一個公司什麼最重要?當然是流量!一個初創公司只要有流量,就可以輕輕鬆鬆拿到投資,一個大型網際網路只要有流量,就可以輕輕鬆鬆躺著賺錢!為了流量企業也是和移動運營商”相互勾結”,推出了諸如:大王卡、大牛卡、寶卡、日租卡、平臺應用免流卡等等,各種各樣的手機SIM卡,唯一的目的不過就是圈人頭!

為了圈人頭各大公司也是絞盡腦汁,按照增長黑客的指導思想,病毒式的營銷方案!利用各種高深演算法像你推薦各種東西,例如:脈脈,職場中會向你推薦同一所高校畢業的同事,同一個家鄉的同事等等,這些都屬於二度人脈的推廣!

如果把你的微信好友作為一度人脈的話,那麼你微信好友的好友就屬於你的二度人脈,而你微信好友的好友的好友就是你的三度人脈,畫個圖簡單看一下(圖A):

通常情況下我們所指的二度人脈基本都是一個泛指,泛指除了一度人脈之外的所有關聯的人脈關係,如:三度、四度、五度甚至六度人脈等!

那麼問題來了,如果讓你實現推薦二度人脈這個功能,你會如何實現哪?

四、二度人脈推薦實現及對比

相信有一定基礎的小夥伴都可以很輕鬆的實現一個推薦二度人脈的資料庫表設計和程式碼實現。資料庫首先有一個使用者表user,用於表示使用者的基本資訊,然後一個有一個好友表user_friends,用於表示好友之間的關係。查詢你的一度人脈就是直接根據你的使用者ID到user_friends表中查詢好友的ID;查詢你的二度人脈是先根據你的使用者ID去user_friends表中先查出來你的一度人脈,然後得到所有一度人脈的使用者ID,然後根據這些所有一度人脈的使用者ID再去user_friends中查詢他的好友!那麼如果讓你查詢三度、四度、五度人脈哪?哇!想都不敢想!一個複雜的人脈關係網例如圖B:

如果你確實厲害,對於上述查詢三度、四度、五度人脈都是小意思!那麼幫忙查一個五度範圍內和我是同一個家鄉的好友!注意:這裡加了一個附加屬性“同一個家鄉”!可能此時你還認為這是一件簡單的事,也不過是先把所有的五度範圍內的人脈找出來,然後在搜尋一下和我是同一個家鄉的而已!

厲害了!可能此時你的程式碼已經完成,然後準備測試!但是,此時的結果可能會讓你失望!查詢的效率可能會極低極低!完全是一個無法接受的範圍!(後邊會有測試看結果!)

有想法的小夥伴可能已經注意了,利用自己所學的知識,圖B不就是一張我們資料結構中的有向圖嗎?而搜尋二度人脈、三都人脈等不就相當於圖的一個節點到達另一個節點的路徑為2、為3的搜尋嗎?而圖的搜尋常用的演算法不就是深度有限演算法、廣度優先演算法、迪克拉斯演算法嗎?

看到這裡,感覺到你已經領略到圖資料庫的精髓了!圖資料庫可以很輕鬆的實現上述二度人脈、三度人脈等的查詢。

有一個很有意思的測試,一種是通過關係型資料實現上述功能,一種是通過圖資料庫實現上述功能,測試的案例是:我們希望在一個社交網路裡找到最大深度為5的朋友的朋友。假設隨機選擇兩個人,是否存在一條路徑,使得關聯他們的關係長度最多為5?對於一個包含100萬人,每人約有50個朋友的社交網路, 圖資料庫與關係型資料庫執行時間對比:

在深度為2時(即朋友的朋友),假設在一個線上系統中使用,無論關係型資料庫還是圖資料庫,在執行時間方面都表現得足夠好。雖然Neo4j的查詢時間為關聯式資料庫的2/3,但終端使用者很難注意到兩者間毫秒級的時間差異。當深度為3時(即朋友的朋友的朋友),很明顯關係型資料庫無法在合理的時間內實現查詢:一個線上系統無法接受30s的查詢時間。相比之下,Neo4j的響應時間則保持相對平坦:執行查詢僅需要不到1s,這對線上系統來說足夠快了。

在深度為4時,關係型資料庫表現出很嚴重的延遲,使其無法應用於線上系統。Neo4j所花時間也有所增加,但其時延在線上系統的可接受範圍內。最後,在深度為5時,關係型資料庫所花時間過長以至於沒有完成查詢。相比之下,Neo4j則在2 s左右的時間就返回了結果。在深度為5時,事實證明幾乎整個網路都是我們的朋友,因此在很多實際用例中,我們可能需要修剪結果,並進行時間控制。

將社交網路替換為任何其他領域時,你會發現圖資料庫在效能、建模和維護方面都能獲得類似的好處。無論是音樂還是資料中心管理,無論是生物資訊還是足球統計,無論是網路感測器還是時序交易,圖都能對這些資料提供強有力而深入的理解。

而關係型資料庫對於超出合理規模的集合操作普遍表現得不太好。當我們試圖從圖中挖掘路徑資訊時,操作慢了下來。我們並非想要貶低關係型資料庫,它在所擅長的方面有很好的技術能力,但在管理關聯資料時卻無能為力。任何超出尋找直接朋友或是尋找朋友的朋友這樣的淺遍歷查詢,都將因為涉及的索引數量而使查詢變得緩慢。而圖資料庫由於使用的是圖遍歷技術,所需要計算的資料量遠小於關係型資料庫,所以非常迅速。

此時,我們還沒有真正的瞭解到底什麼是圖資料庫,但是我們已經可以領略到圖資料庫的威力了!

五、揭開圖資料庫的面紗

圖資料庫源起尤拉和圖理論,也可稱為面向/基於圖的資料庫,對應的英文是Graph Database。圖資料庫的基本含義是以“圖”這種資料結構儲存和查詢資料,而不是儲存圖片的資料庫。它的資料模型主要是以節點和關係(邊)來體現,也可處理鍵值對。它的優點是快速解決複雜的關係問題。

圖具有如下特徵:

  1. 包含節點和邊;

  2. 節點上有屬性(鍵值對);

  3. 邊有名字和方向,並總是有一個開始節點和一個結束節點;

  4. 邊也可以有屬性。

說得正式一些,圖可以說是頂點和邊的集合,或者說更簡單一點兒,圖就是一些節點和關聯這些節點的聯絡(relationship)的集合。

通常,在圖計算中,基本的資料結構表達就是:

 

G=(V, E); V=vertex(節點); E=edge(邊)

如下圖所示:

圖資料庫名字的由來其實與其在底層的儲存方式有關,Neo4j底層會以圖的方式把使用者定義的節點以及關係儲存起來,通過這種方式,可以高效的實現從某個節點開始,通過節點與節點間關係,找出兩個節點間的聯絡。

從這段描述中可以猜得到,在Neo4j中最重要的兩個元素就是節點和關係。說到節點和關係,就必須引出一個非常重要的概念,屬性圖模型(Property Graph Model)。如下所示:

  1. 一個圖中會記錄節點和關係;

  2. 關係可以用來關聯兩個節點 ;

  3. 節點和關係都可以擁有自己的屬性;

  4. 可以賦予節點多個標籤(類別);

六、圖資料庫的代表Neo4j

目前市面上有很多圖資料庫,例如:Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan、TigerGraph、Cayley等,但目前較為活躍可以稱之為代表的當屬Neo4j。

Neo4j官方地址:https://neo4j.com/

Neo4j的安裝使用很簡單,如果是Window平臺的話直接安裝就可以,然後配置一下環境變數即可使用!這裡不再介紹,下邊看一下簡單使用。

1,Neo4j瀏覽器:

Neo4j伺服器具有一個整合的瀏覽器,在一個執行的伺服器例項上訪問 “http://localhost:7474/”,開啟瀏覽器,顯示啟動頁面:

預設的host是bolt://localhost:7687,預設的使用者是neo4j,其預設的密碼是:neo4j,第一次成功登陸到Neo4j伺服器之後,需要重置密碼。訪問Graph Database需要輸入身份驗證,Host是Bolt協議標識的主機。

2,在Neo4j瀏覽器中建立節點和關係:

示例,編寫Cypher命令,建立兩個節點和兩個關係:

 

在$ 命令列中,編寫Cypher指令碼程式碼,點選Play按鈕,點選建立第一個節點:

3、在第一個節點建立之後,在Graph模式下,能夠看到建立的圖形,繼續編寫Cypher指令碼,建立其他節點和關係:

4、在建立完兩個節點和關係之後,檢視資料庫中的圖形:

七、總結

圖資料庫它善於處理大量的、複雜的、互聯的、多變的網狀資料,其效率遠遠高於傳統的關係型資料庫的百倍、千倍甚至萬倍。圖資料庫特別適用於社交網路、實時推薦、銀行交易環路、金融徵信系統等廣泛的領域。領英、沃爾瑪、CISCO、HP、eBay等全球知名企業都在使用圖資料庫Neo4j,中國企業也在逐步開始用圖資料庫來構建自己的應用。

上文從查詢二度人脈的角度一步步引出了圖形資料庫,並簡單的介紹了其概念。本文的主要目的還是以介紹為主,帶你認識新技術,而更多的使用以及各種圖形資料庫之間的對比,優點缺點,僅僅靠一篇文章是完全不夠的!還望讀者下來之後觀望閱讀或者自行查詢資料進行學習!

如果你還沒有接觸過或者用到圖資料庫,相信我不久的將來你肯定會接觸到或者用到!趁著圖形資料庫現在還不像MySql或者Redis那樣普遍,抓住機會!趕緊好好學習一下吧!

參考文章: 
1、http://www.iteye.com/news/32186 
2、https://www.jianshu.com/p/97c6752e928b 
3、https://www.cnblogs.com/ljhdo/archive/2017/05/19/5521577.html

 

相關文章