大推!Neo4j 圖資料庫,好用!

Lowson Li
8 min readJun 14, 2021

--

網絡資料分析從這裡開始比較不痛苦!

Photo by JJ Ying on Unsplash

為什麼要寫這篇文章?

好像有很多人對我碩士做的研究很好奇,並且對其中應用到的圖資料庫(Graph Database)很有興趣。剛好最近也要從學校登出了,想說來寫篇系列文來紀念一下~如果大家有感興趣的部分,歡迎留言告訴我,我會想辦法回答你!

適合閱讀者:對圖資料庫感興趣者、有 SQL 語感者、想看我畫虎爛者
閱讀等級:除去 code 以外都是可親的闔家觀賞,你也可以純當故事看

你將在這篇文章中獲得什麼?

  1. 基礎圖學知識(蠻貧乏的)
  2. 圖資料庫與關聯式資料庫的差異
  3. Neo4j 好用功能
  4. 安裝指示(怠惰拖延中)

1. 基礎圖學知識:有沒有圖差很多!

假設今天你在一個 10,000 人的集團內擔任老闆小秘書,老闆問你:「早上來報告的 Alice 隸屬於哪些部門?(急欲認識 Alice 貌)」你要怎麼辦?

身為萬能小秘書,你自信的打了通電話給集團內的資深人資主管,把問題丟給他…於是,資深人資主管很快的回覆:Alice 員工編號 815, 隸屬於 4Future、P0815 與 A42 部門…等個人資訊。

問題解決(反正只是把問題丟給別人XD),小菜一碟。

你把 Alice 的個人資訊都彙報給了老闆,預期老闆會露出志在必得的微笑。但事實是老闆嘴角只上揚了0.3秒,並接著問道:「她的朋友都是誰?給我她朋友(friends)還有朋友的朋友(friends of friends)的所有資料!」

於是乎你又打了通電話給資深人資主管(你是韓總機膩?),主管回答道:「抱歉,我不是徵信社」

好吧,你的升官運就此停止…嗎?

你想到國中老師教的兩點連成一線,你 google 如何查詢人際關係,你查到人際關係其實可以表示成一張圖(graph)

一張人際關係圖,展示 25 人的友誼連結。
使用 Cypher 查詢 25 位員工的友誼網絡

你了解到,每個人際關係圖,都有兩個基本要素組成:人員以及友誼連結。

這其實就對應到了圖論中的 G = (V, E)

^_^?G就是圖(graph),V 就是點(vertex),E 就是邊(edge),懂?

你是看懂了,但是還是苦無資料。

於是你翻開覆蓋的魔法卡使出小秘書獨有賤招:「濫用特權!」,對整個集團的人發放問卷,請每個員工勾選出公司內朋友名單。

至此,你有了每個人的朋友清單,請工程師幫你整理,大概長這樣:

員工姓名與朋友清單
使用 Cypher 將朋友的姓名搜集成 list,回傳員工姓名及朋友清單

看起來有夠噁心!鬼知道老闆心心念念的 Alice 在哪裏…怎麼辦…

2. 圖資料庫與關聯式資料庫的差異

你問了資深人資主管,他剛剛怎麼查的。人資主管大言不慚的說:「我也是問數據庫的分析師才知道的。(公司難免會有很多人是專業總機)」於是你問分析師他會不會處理這些鬼資料,他表示:「沒有什麼很快的、可以用現有關聯式資料庫(RDBMS)快速查詢人際關係資料的方法。」

為什麼沒有很快的方法?其實有,只是不常見!

常見的數據庫,要處理如同人際關係這種網絡資料(network data),必須將「人名」與「好友」預先儲存在一張表上,以便查詢時傳喚使用。如下表,命名為 user_friend_table:

╒═══════════╤═════════════════╕
│"user_name"│"friend" │
╞═══════════╪═════════════════╡
│"Paul" │"Haruka" │
├───────────┼─────────────────┤
│"Paul" │"Matthew" │
├───────────┼─────────────────┤
│"Paul" │"John" │
├───────────┼─────────────────┤
│"Paul" │"Deb" │
├───────────┼─────────────────┤
│"Paul" │"Rebecca" │
├───────────┼─────────────────┤
│"Paul" │"Gabi" │
├───────────┼─────────────────┤
│"Paul" │"Maria" │
├───────────┼─────────────────┤
│"Paul" │"Pamela" │
├───────────┼─────────────────┤
│"Paul" │"Courtenay" │
├───────────┼─────────────────┤
使用 Cypher 回傳用戶與朋友表

若使用資料庫如 MySQL 查詢 Alice 身邊的好友,則可以使用下列 SQL查詢:

使用 SQL 查詢 Alice 一度好友

如果要查Alice 身邊的好友的好友呢?你可能要分析師寫一個 semi-join(至於這是什麼?我以後也會專門撰文跟大家講解的…老高魂)

使用 SQL 查詢 Alice 二度好友

那如果老闆想要 Alice 好友一族升官發財,要的名單是好友的好友的好友呢?(三度關係)你可能分析師要寫兩個 semi-join…且速度比圖資料庫慢

使用 SQL 查詢 Alice 三度好友

那老闆如果想問他跟 Alice 中間差幾個人可以認識彼此呢?這就是一個最短路徑問題(Shortest Path)

這時候分析師兩手一攤放棄使用 MySQL,改用了圖資料庫 Neo4j…

3. Neo4j 真心好用:學會這些讓你「找朋友」省下一堆時間

「想找 Alice 的好友一族?找 Neo4j!」分析師快樂的模仿起 trivago 一哥的口氣,開心的完成了老闆交代給小秘書交代給他的工作(你沒看錯,這就是社會現實分工狀態😩)

如何辦到的呢?首先,分析師把員工當作節點(node = vertex),讓個人資訊依附於節點上,並且依照問卷資料上的朋友資訊匯入員工彼此之間的友誼連結(relationships = edge)。這些節點與關係的資料被匯入到 Neo4j 中。(匯入資料的步驟取決於資料或檔案型態,可以是 node 一張 csv 表,relationship 一張csv表。也可以是一個 json 檔,將朋友名單儲存於 value 中)

接下來,就是見證奇蹟的時刻了…(假設你已經成功匯入資料)

使用 Cypher(圖資料庫查詢語言),不論你是老闆還是小秘書還是分析師,都可以省去一堆頭疼的複雜查詢語句。

以查詢 Alice 的好友一族(三度關係)名單為例:

使用 Cypher 查詢 Alice 三度好友

三行解決,舒舒服服。

翻譯成人話:

第一句話:「找尋一種模式(pattern),員工 u 以友情關係連結到另一員工 u2。並限縮關係在三度以內。」

第二句話:「限定這個 員工 u 的名字必須要叫 Alice。」

第三句話:「回傳不重複的員工 u2 的名字,將該欄位命名為 friend_name」

如果你想讓老闆與 Alice 快速建立小小的愛情火花,你可以幫老闆查查他與 Alice 的最短路徑:

首先,創建一個虛擬的圖,命名為 myGraph,並投影(projection)節點及關係。

將必要的節點與關係投影至新的圖,以利後續分析

Graph Data Science Library 進行圖算法(graph algorithm)。運行最短路徑演算法(這裡使用 Dijkstra Shortest Path algorithm)。

找尋老闆與 Alice 的最短路徑

這樣就好惹~恭喜你已經成功幫老闆 Hentai 桑找到員工 Alice 的最路徑!也成功開啟了小秘書升遷之門!(才怪)

4. 安裝指示:好吧,前面你可能都知道了,我只能教你一些煩人的…

但我現在有點懶得講,下次再補~

你英文好的話,可以看看官方文件

結語:你可能會用到也可能不會,so what?

哈密瓜有種哈味,但是對哈密瓜過敏的人無法體會。懂?

投資一定有風險,但是投資自己學習一門新的技術很少會賠。

學習圖資料庫的重點在於學習她的 Cypehr 查詢哲學。學習如何在茫茫網絡資料中萃取出重要的資訊、如何進行圖資料科學(graph data science)、如何幫老闆促成姻緣(誤)。

學得開心最重要~希望你也能找到更多圖資料好玩的應用~

註:如果你對文中的資料如何產製有興趣,可以參閱圖或表下方的 Cypher code block。目前圖資料庫 Neo4j 廣泛應用於各大企業中,包含金融、零售、生命科學、電信、政府機關等。客戶包含但不限於:瑞士銀行(UBS)、eBay 購物網、諾華製藥(Novartis)、思科(Cisco)、美國航太總署(NASA)等。應用及發展前景相當不錯。

--

--

Lowson Li

Economic / Data Science / A Capella 通常我會忘記三餐吃什麼,可能是腦子裝太多奇怪的知識?