什麼是圖數據庫以及簡單入門

一、關係型數據庫的不適性

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

用戶、系統和傳感器產生的數據量呈指數增長,數據量不斷增加,大數據的存儲和處理;

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

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

二、NoSQL數據庫的數據模型

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

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

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

BigTable實現(BigTable-implementations);

文檔庫(Document-stores);

圖形數據庫(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。圖數據庫的基本含義是以“圖”這種數據結構存儲和查詢數據,而不是存儲圖片的數據庫。它的數據模型主要是以節點和關係(邊)來體現,也可處理鍵值對。它的優點是快速解決複雜的關係問題。

圖具有如下特徵:

包含節點和邊;

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

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

邊也可以有屬性。

什麼是圖數據庫以及簡單入門

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

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

G=(V, E)

V=vertex(節點)

E=edge(邊)

如下圖所示:

什麼是圖數據庫以及簡單入門

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

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

什麼是圖數據庫以及簡單入門

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

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

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

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

六、圖數據庫的代表Neo4j

目前市面上有很多圖數據庫,例如:Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan、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命令,創建兩個節點和兩個關係:

 CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;
CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"})
create (n)-[r:Friend]->(m) return r;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"})
create (n)

在$ 命令行中,編寫Cypher腳本代碼,點擊Play按鈕,點擊創建第一個節點:

什麼是圖數據庫以及簡單入門

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

什麼是圖數據庫以及簡單入門

4、在創建完兩個節點和關係之後,查看數據庫中的圖形:

什麼是圖數據庫以及簡單入門

七、總結

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


分享到:


相關文章: