圖算法你好: 以 Neo4j 為主的開發環境

如何在 Neo4j 與 Python 之間交互搭配的使用配置

Youngmi huang
11 min readJul 15, 2019

本篇為上篇,主要針對 Neo4j 環境配置與圖算法做簡介;下篇是透過配置好的環境進行簡單的操作,以 The Game of Thrones 角色關聯度為例子:圖算法你好: 以 Neo4j 進行《冰與火之歌:權力遊戲》實作

前情提要

由於期末項目需求:基於圖分析和半監督學習的方式來檢測金融反欺詐,需使用 Neo4j 系統存儲、展示和分析客戶交易關係圖,透過 Label Propagation方法檢測交易欺詐,因此進入圖算法領域。如果你也是,那就一起栽入這個坑吧。

在經歷過許多嘗試和踩坑之後,總結:在深入動手做圖算法之前,要先判斷/探勘所使用的數據集是否適合。當圖當中任意兩節點之間的連結不完全,也就是他們並不能透過與其他節點所連接的邊而抵達彼此的時候,所能反映的關聯關係就很有限,因此這類的數據集較不適合使用圖算法做 Community Detection 或是 Path Finding 之類的。

在 KDD 2018 中的 Tutorials 中一篇 Large-Scale Graph Algorithmics: Theory and Practice,很好地整理了覆蓋圖算法範疇:從構建圖 (Graph Building) 、到運用標籤傳播進行 Clustering、以及根據 PageRank 衡量節點重要性 (Centrality Scores/Ranking) 等。

Large-Scale Graph Algorithmics: Theory and Practice

圖 ( Graph ) 的簡介

圖是由節點 (Node) 、邊 ( Relationships)、屬性 (Properties) 所構成。

Graph Algorithms

在研究過程,看到許多社交網絡圖、角色關係圖、甚至是部分反欺詐的案例的圖是長這樣:

  • 第一張是 Twitter名人的社交網絡圖彼此的連接關係,可以用社交網絡的六度關係理論去理解:我的好友的好友的好友的好友的好友的好友…就會連接到 Elon Musk,也就是我跟 Elon Musk 之間只要透過邊的連結,我這個實體就會連到 Elon Musk 這個實體。
  • 第二張圖是說明在整個網絡當中,自然而然會有扮演連接不同實體的樞紐點(可以想像成扮演友誼橋樑的中介點)
  • 建立在前兩點的基礎之上,第三張與第四張圖是基於標籤傳播想法,將一個大網絡分成兩個或以上不同的社區,進而達到分類/分群的目的。
複雜關係網絡圖的四個例子

然而在部分數據集當中,由於數據本身的信息有限,建立的圖並無法產生如社交網絡的密集的關係網絡圖,以我這次使用的交易欺詐數據集而言 (Synthetic Financial Datasets for Fraud Detection),交易轉出帳戶多屬於一次性交易,缺乏關聯信息的特徵(例如電話、裝置ID、IP位置等),無法僅靠交易轉入轉出帳戶建立緊密的網絡關係圖。

透過 neo4j 呈現的欺詐交易(灰色節點為交易轉出帳戶,紅色節點為轉入帳戶)

由於上述這樣的圖結構,使用 Community Detection,就會很悲劇的產生了很細碎的社區,因此初期在判斷數據集是否能夠建立緊密的關係圖真的很重要。

然而幸運的是,透過 Kevin Tseng 的文章分享,得知現有 PTT 網絡版爬蟲的工具,可以很方便的使用寫好的爬蟲爬取 PTT 數據,並初步構建以下網絡圖:黃色節點為發文者ID、灰色節點為底下推文ID,可以看到中間有部分 ID 會去推文多位作者的情況(鐵粉 or 相互推文的殭屍)。

PTT部分社交網絡圖,由於效能有限,僅取底下推文數量前七名作為黃色節點 (發文ID)

圖算法的技術實現工具

Neo4j 簡介

圖數據庫,支援多種語言,分為社區版 ( 免費、for 個人使用 ) 和企業版,以下皆以社區版為例。透過 web 瀏覽器作為客戶端介面,並且搭配 Cypher 語言進行查詢 (query),跟 SQL 的邏輯蠻像的,因此相對容易上手。

Neo4j 官網

A highly scalable open source graph database that supports ACID, has high-availability clustering for enterprise deployments, and comes with a web-based administration tool that includes full transaction support and visual node-link graph explorer.

Neo4j 可以存儲任何形式的數據,通過 Key-Value 的雙向列表來保存節點和關係的屬性。在實際應用中一個實體通常包含眾多屬性,若將這些屬性全部存儲到 Neo4j 當中,在查詢的時候將會非常緩慢,因此分析的維度與視角變得十分重要。

  • 若使用的是社區版,僅適用於存儲實體關係和實體簡單的屬性,中文社區當中有人提到:最多支持 320 億個節點、320 億個關係和 640 億個屬性,這裡是指存儲或是背後可運算量;實際上視覺化呈現操作時,仍會根據個人電腦效能有所不同(預設上限是 3000 個節點應該有它的道理存在 XD,有嘗試調高到 5000 就非常 LAG)。
  • Neo4j 企業版可以部署高可用集群或因果集群,承載高並發的工作量以及更多的讀取負載的處理能力(對於存儲節點、關係、屬性等皆無限制)。

其他:python-igraph、NetworkX

NetworkX 和 igraph 都是做網絡圖分析的時候常被使用的套件,並且都可以透過 python 實現創建節點、邊、屬性,以及支援一些圖算法等。

NetworkX is a pure-python implementation, whereas igraph is implemented in C.

兩者皆可以搭配 matplotlib 在 jupyter notebook 做可視化,這邊有 各機場航班之間的關係圖(NetworkX) 以及 創建中國古代戰國群雄的關係圖 (igraph) 案例可以練習上手。

  • 視覺化效能:在研究開發工具的時候,有發現普遍網路找得到的網絡圖分析節點的規模數都不大 (<500 個節點)。實驗之後,當需要呈現的節點數量級別一大,不管是用 NetworkX 或是 igraph, 效能與 Neo4j 一比,還是非常慢(而且很容易死在裡面)。

雖然 Neo4j 社區版可以設定視覺化的節點數,但上限約到 5000 -7000 個節點時會是一個當機的臨界點,若有其他工具的使用,也歡迎分享。

Neo4j 環境配置

官網下載 community server 版本 (社區版):按照步驟安裝即可,我下載的是 3.5.7 版本。接著找到你安裝的路徑,進入 neo4j/bin 就可以成功啟動與停止 Neo4j 了,啟動之後是會開啟一個瀏覽器介面的 localhost。

# start
./neo4j start
# close
./neo4j stop
# 在瀏覽器視窗當中下 query 的小技巧
shift + enter 是換行 ; ctrl + enter 是執行

出現以下畫面後,將 http://localhost:7474/貼到瀏覽器即可開啟

成功登入畫面

與 Neo4j 搭配使用的工具

配置可調用圖算法的 plug-in:algo, apoc

  1. 簡介:algo 與 apoc 是支援許多圖算法並且可以與 Neo4j 搭配使用的 package,apoc 在網路上的實作範例比較多,而 algo 算比較新並且整合了原本在 apoc 當中的用法,同時,在搭配使用 Neo4j 3.5 版本的時候,與 apoc 會有部分不相容的地方,因此需要使用 algo 做實現。

2. 下載 .jar 檔(algoapoc 下載連結),並放到 neo4j/plugins 路徑底下。

algo download
apoc download

3. 配置文件:接著在 neo4j/conf/neo4j.conf 底下加入以下命令:

# 讓 db 能夠使用 algo 與 apoc package
dbms.security.procedures.unrestricted=algo.*,apoc.*
# 重啟 neo4j server
neo4j.conf 配置文件

重啟之後在瀏覽器介面輸入 return apoc.version() ,若成功返回安裝版本就代表成功了!

# 備註:另一種寫法(網路上大部分的配置方法)會失敗, 不知道是不是因為今年 neo4j 更新到3.5的關係
dbms.security.procedures.unrestricted=algo.*
dbms.security.procedures.unrestricted=apoc.*

py2neo 下載

py2neo 是連接 Neo4j 數據庫的 package,角色是在 python 端進行數據清理後,將節點、邊、關係屬性與權重等寫入圖數據庫,當然也可以從數據庫進行查找。 pip install py2neo 安裝即可,詳細的連線方式可以參考這裡

# 在連接前須先在終端啟動 neo4j
from py2neo import Graph
graph = Graph('bolt://127.0.0.1:7687')

在使用過程若遇到無法連接的問題時,到 neo4j/logs/neo4j.log查看服務是否有起起來。

如果沒有起起來的話,可能是因為尚未 enable bolt 遠端連線方式,需要到 neo4j/conf/neo4j.conf 配置文件底下更改 bolt 連線設定:

neo4j.conf 配置文件
注意 bolt 的 port 是在 7687

其他資源

  • Graph AlgorithmGraph DataBases (2019.10 網址更新):這兩本都是 Neo4j 出的,在官網可以免費下載,其中 Graph Algorithm ( Mark Needham & Amy E. Hodler, 2019/5 Release ),這本寫得蠻全面的,對於入手研究圖數據庫和算法的時候非常有幫助。
  • neo4j 官網(英文):文件和實作範例蠻完善的,建議可以從這裡開始,有遇到問題再從 neo4j 中文社區 中文社區裡面查答案。

(2019/7/16 補充)

  • Gephi 也是一種圖算法 & 分析工具的選擇,兩者在彼此的官網都有互相引流 XD,例如 Neo4j Visualization with Geph,也就是說 Gephi 和 Neo4j 之間有多種介接 Plugin 可用(例如可以連接到 Neo4j 的數據庫),而且 Gephi 看起來可以支援規模較大的圖。

The basic idea of the project is twofold:

1. Users of Neo4j get better visualization support

2. Users of Gephi can work with larger graphs

如果這篇文章有幫助到你,可以幫我在下方綠色的拍手圖示按5下,只要登入Google或FB,不需任何花費就能【免費支持】youmgmi 繼續創作。

--

--

Youngmi huang

Participate in data science field, fascinated by something new. (Current: fraud risk modeling with ML/DL, Past: NLP)