隨著大數據和社交媒體的興起,網絡型(圖型)數據變得越來越重要。什麼是網絡型數據?這是和關係型數據相對應的一種數據模型。
對於計算機專業的從業人員來說,關係型數據模型是數據庫系統的理論基礎,在關係數據模型之上定義的結構查詢語言SQL更是任何大規模信息系統所不可或缺的工具。在功能強大的SQL語言之上,為什麼我們還需要對網絡型數據模型和相應的數據庫系統?
舉個栗子
我們可以舉一個例子來說明。
有一個很有名的關於社會關係的假設,哈佛心理學教授Stanley Milgram在1967年提出的“六度分隔理論”。這個理論認為,這個世界上的任意兩個個人之間,所間隔的“認識”關係不會超過六個。或者說,不管你提出哪一個現在世界上活著的人,這個人一定在我所認識的人所認識的人所認識的人所認識的人所認識的人所認識的範圍裡。如果我們可以把這個世界上所有的人的“認識”關係都存在一個數據庫裡,我們就可以來檢驗這個理論是否為真。
存儲這種“認識”關係的數據模型應該如何建立呢?讓我們分別用傳統的關係數據模型和新的圖型數據模型來試試。
關係數據模型
我們只需要兩個表:
- 表一:people: global unique ID, name, birthday, sex, ....
- 表二:knows: people global ID 1, people global ID 2.
這個世界上的每一個人,在表一里應該有一條記錄,而這個人所有的“認識”關係則在表二中表達。
圖型數據模型
我們需要一種節點 (Node)和一種關係 (relation):
- 節點:people: global unique ID, name, birthday, sex, ....
- 關係: knows:people node 1 ---> people node 2.
這個世界上的每一個人,應該有一個相應的節點,而這個人所有的“認識”關係則在與之相連接的關係中表達。
乍一看來,圖型數據模型和關係數據模型似乎沒什麼大的區別。
但是,當我們要在這個模型上用每個模型的查詢語言來驗證六度分隔理論時,這個區別就很明顯了。要驗證這個理論,我們應該檢查每一個人的關係,從表一的整體集合減去六次“認識”關係傳遞後的集合從表一中減去,然後看是否有餘下的。如果有,則理論不成立。
用常用SQL語言驗證
首先用我們都熟悉的SQL語言來表達以上邏輯:
第一層認識關係:
第二層認識關係:
第三層認識關係:
這樣一直到第六層:
然後我們需要把這六個結果集合並起來,再與整體PEOPLE 表相比較:
將以上值和 select count(ID) from PEOPLE 的結果相比較。如果不相等,那麼這個理論就不成立。
如果要完整證明此理論,需要將所有人都代入 chosen_person_id 來試一次才行。
粗粗看來,這個求解方案並不複雜,但是需要在KNOWS 這個可能有數百億到上千億條記錄的表之間做六次連接操作,這個執行性能恐怕會讓人無法接受,而且其表達方式也很笨拙。如果我們需要考慮更長的關係鏈路,其性能和方案表達會越來越差。
用圖形查詢語言Cypher驗證
我們再來看看圖型數據模型的查詢語言如何表達這個問題。我這裡選用最流行的圖形查詢語言 Cypher 來做驗證:
以下語句可以獲得對任何特定個人來說的所有六度分隔範圍內(包括自己)的人數:
而所有人的計數也很簡單:
將以上兩個數值一對比就可以了。
這裡解釋一下Cypher語句的含義。如果我們把第一句Cypher語句轉換成近似SQL(但不是真正SQL)的語句,就是:
Cypher語句相比SQL語句來說要簡潔了很多倍。這就是新式的圖型查詢語言的威力和妙處的體現。
Neo4j 系統
既然提到了Cypher,我們就正式介紹Cypher所基於的系統,Neo4j。它是由Neo4j公司所開發的最流行的圖型數據庫系統。按照公司網站的介紹,公司的三個創始人從2000年開始為了解決關係數據庫系統在處理特定問題時的性能問題而開始開發了Neo4j的原型系統,在2003年就開發出了可以部署在24x7穩定生產環境中的Neo4j系統。他們在2007年將Neo4j開源,而在2009年獲得了第一筆種子投資,並很快在2010年正式發佈了Neo4j版本 1.0。到2008年為止,Neo4j公司獲得了五輪共計大約1.5億美元的投資。現在Neo4j系統最新版是大約半年前發佈的版本3.5.8.
Neo4j的客戶包括不少大公司,如沃爾瑪、ebay、airbnb、微軟、IBM、洛克希德、UBS、孟山都等。其應用類型包括商務智能、內容管理、客戶關係管理、反欺詐、知識圖譜、社交網絡、推薦引擎、IT運營等等。
Neo4j系統是雙許可證模式:社區許可證和企業版。社區版是免費使用,但是隻能在單機上運行,也沒有熱備份等對於生產運營系統必不可少的一些關鍵功能。需要這些額外功能的客戶可以選擇企業版,花錢消災。
具體Cypher語句示例
最後,我們來看看幾個具體Cypher語句,來稍微瞭解一下其使用:
- 創建節點:
這個語句為電影“達芬奇密碼“建立一條記錄,以“Movie”為其標籤(label),而其名字、發行年份和電影宣傳詞作為屬性(property)。
這兩條語句為男主演湯姆-漢克斯和女主演奧黛麗-朵杜分別創建一條記錄,標籤為“Person”,名字和出生年份為屬性。
- 創建關係:
這條語句建立了演員湯姆-漢克斯和電影“達芬奇密碼”之間的關係,飾演的角色是這個關係的屬性。
類似的,為女主演也建立一個連接:
運行這四條語句之後,在Neo4j 桌面版中可以運行以下查詢語句:
其結果如以下圖形所示:
如果我們在這個庫中加入很多電影的數據,就可以做更有趣的查詢。例如:
查找所以湯姆-漢克斯所出演的電影。其圖形結果如下:
當然,Cypher更擅長的是圖形遍歷查詢,例如:找出《教父》中男演員艾爾—帕西諾和《壯志凌雲》裡面的女配角梅格--瑞安的最短關係路徑:
其結果是:
這種查詢用SQL很難表達出來,但是用Cypher就很簡潔明瞭。
當然,一個查詢語言要與其他系統集成使用,光有圖形結果表達是不夠的。在這方面,Neo4j的結果可以表達為JSON,例如以上結果的JSON數據是:
Neo4j官方有多個語言的客戶端驅動,包括Java(Neo4j系統的實現語言)、JavaScript、Python、.NET和GO。另外開源社區還提供了Spring、Ruby、PHP、R、C++等語言的驅動。對於絕大多數的項目,應該都是夠用了。
Cypher和Neo4j還要很多別的有趣的功能,若有興趣,可以去其官網下載免費社區版來學習體會。官網還可以下載免費的電子書《Graph Databases for Connected Data》,值得去看看。
我們會每週推送商業智能、數據分析資訊、技術乾貨和程序員日常生活,歡迎關注我們的頭條&知乎公眾號“微策略中國”或微信公眾號“微策略 商業智能"。
閱讀更多 微策略中國 的文章