返回文章列表

Python圖形資料建模實務

本文探討如何使用 Python 進行圖形資料建模,涵蓋 NetworkX 和 igraph 等工具,並以電視推薦系統為例,演示從資料準備到模型建立和分析的完整流程。同時,文章也介紹了圖形資料函式庫 Neo4j 與 Cypher

資料科學 Python

圖形資料建模在處理複雜資料關係時展現出強大優勢,適用於社交網路分析、推薦系統等領域。本文將介紹如何運用 Python 工具 NetworkX 和 igraph 建立與分析圖形模型,並以電視推薦系統案例逐步講解實作過程,包含資料準備、模型建構、相似度分析等環節。此外,文章也將探討圖形資料函式庫 Neo4j 和 Cypher 查詢語言,以及如何將關聯式資料函式庫轉換為圖形資料函式庫,並深入解說節點、邊、屬性等圖形資料模型的核心概念,以及無向圖、有向圖和異質圖形的特性與應用。最後,本文將比較圖形資料函式庫與關聯式資料函式庫的優劣,並探討圖形資料建模的未來發展趨勢。

圖形資料建模在 Python 中的應用

從資料整理到分析與建模的實用

圖形資料是一種強大的工具,能夠幫助我們理解和分析複雜的資料關係。在本篇文章中,我們將探討如何在 Python 中進行圖形資料建模,從基礎概念到實際應用案例。

為什麼使用圖形資料?

圖形資料由節點(nodes)和邊(edges)組成,能夠有效地表示實體之間的關係。與傳統的關聯式資料函式庫相比,圖形資料函式庫在處理複雜關係查詢時具有明顯的優勢。

圖形的基礎組成

  1. 節點(Nodes):代表實體或物件。
  2. 邊(Edges):代表節點之間的關係。
  3. 屬性(Properties):節點和邊都可以具有屬性,用於描述其特徵。

圖形資料的型別

  1. 無向圖(Undirected Graphs):邊沒有方向,表示雙向關係。
  2. 有向圖(Directed Graphs):邊具有方向,表示單向關係。
  3. 異質圖(Heterogeneous Graphs):包含不同型別的節點和邊。

從關聯式資料函式庫到圖形資料函式庫的轉換

許多現有的應用程式根據關聯式資料函式庫,但隨著資料複雜度的增加,圖形資料函式庫成為更好的選擇。轉換過程涉及以下步驟:

  1. 檢查資料:瞭解現有資料結構和關係。
  2. 設計圖形模型:根據資料特性設計合適的圖形結構。
  3. 實作圖形模型:使用 Python 中的圖形函式庫(如 NetworkX 或 igraph)建立圖形模型。

使用 Python 實作圖形模型

import networkx as nx

# 建立一個空的有向圖
G = nx.DiGraph()

# 新增節點及其屬性
G.add_node("Node1", attribute1="value1")
G.add_node("Node2", attribute2="value2")

# 新增邊及其屬性
G.add_edge("Node1", "Node2", weight=1.0)

# 檢檢視的結構
print(G.nodes(data=True))
print(G.edges(data=True))

#### 內容解密:

此程式碼展示瞭如何使用 NetworkX 函式庫建立一個有向圖,並新增節點和邊。add_node 方法用於新增節點並設定其屬性,而 add_edge 方法則用於新增邊並設定其屬性。透過 nodesedges 方法,可以檢檢視中所有節點和邊的詳細資訊。

圖形分析與應用

  1. 連通性分析:評估節點之間的連執行緒度。
  2. 關鍵節點識別:找出度數最高的節點,瞭解其在圖中的重要性。
  3. 社群檢測:識別圖中的社群結構。

使用 igraph 進行路徑分析

import igraph as ig

# 建立一個簡單的圖
g = ig.Graph(directed=True)
g.add_vertices(3)
g.add_edges([(0, 1), (1, 2)])

# 計算最短路徑
path = g.get_shortest_paths(0, 2)

# 輸出結果
print("Shortest path:", path)

#### 內容解密:

此範例展示瞭如何使用 igraph 函式庫建立一個簡單的有向圖,並計算從節點 0 到節點 2 的最短路徑。get_shortest_paths 方法傳回最短路徑的列表,其中每個路徑由節點索引組成。

隨著技術的發展,圖形資料函式庫和相關工具將變得更加成熟和易用。預計在未來的應用中,圖形資料建模將在社交網路分析、推薦系統、知識圖譜等領域發揮更大的作用。開發者需要不斷學習和掌握新的工具和技術,以充分利用圖形資料的潛力。

圖形資料分析與應用:Python 與 Neo4j 實務

本文探討圖形資料分析的技術與應用,涵蓋 Python 程式設計、圖形資料函式庫 Neo4j,以及 Cypher 查詢語言的使用。內容從基礎的圖形資料結構介紹開始,逐步引導讀者建立圖形資料模型、轉換關聯式資料函式庫至圖形資料函式庫,並進行圖形資料分析與視覺化。

本文架構

全書共分為四大部分:

  1. 圖形資料基礎:介紹圖形資料的基本概念、Python 中的圖形處理函式庫(如 igraph 和 NetworkX),以及如何在不同領域中應用圖形分析。

  2. 圖形資料儲存與生產化:探討如何使用 Neo4j 作為圖形資料函式庫,透過 Cypher 查詢語言進行資料操作,並將圖形資料儲存於 Neo4j 中。此外,本部分還涵蓋瞭如何從 Python 與 Neo4j 互動,進行旅行推薦系統的最佳化等實務案例。

  3. 圖形管道開發與最佳化:指導讀者設計圖形資料管道,包括 schema 設計、靜態產品資訊的新增、客戶互動模擬,以及根據品牌的產品推薦等功能。同時,本部分也討論瞭如何重構和演進 schema,以適應不斷變化的業務需求。

  4. 進階圖形分析技術:探討投影(projections)的概念及其在 igraph 和 Neo4j 中的應用,包括如何分析和最佳化投影結果。此外,本部分還提供了常見錯誤的除錯技巧,以及效能最佳化的建議。

主要章節內容

第 5 章:使用圖形資料函式庫

本章介紹 Neo4j 圖形資料函式庫的基本使用方法,包括 Cypher 查詢語言的基礎語法、如何從 Python 連線 Neo4j,以及如何儲存和查詢圖形資料。

第 6 章:管道開發

本章指導讀者如何設計和實作圖形資料管道,包括 schema 設計、資料預處理、客戶互動模擬,以及根據相似度得分的產品推薦系統開發。

第 7 章:重構和演進 Schemas

本章討論了 schema 重構的必要性、如何在圖形資料函式庫中有效地進行 schema 演進,以及如何在開發生命週期中應用這些變更。

第 8 章:完美投影

本章探討投影的概念,包括如何在 igraph 和 Neo4j 中建立和分析投影,以及如何利用投影結果進行進一步的圖形分析。

第 9 章:常見錯誤和除錯

本章提供了除錯圖形相關問題的技巧,包括常見的 igraph 和 Neo4j 問題解決方案,以及效能最佳化的建議。

環境設定與軟體需求

  • Python 版本:3.7/3.8/3.9
  • Neo4j 版本:Community Edition v1.5.7
  • MySQL 版本:5.7.39
  • 作業系統:Windows、macOS 或 Linux

每章節的程式碼倉函式庫中都包含一個 requirements.txt 檔案,用於指定所需的 Python 套件。

本文目標讀者

本文主要針對具有中級 Python 程式設計能力的開發者,以及對圖形資料建模感興趣的資料函式庫開發人員或 IT 專業人士。無論您是想要學習如何構建圖形資料管道、進行圖形分析,還是希望深入瞭解 Cypher 查詢語言,本文都能提供實用的指導和參考。

為什麼應該使用圖形資料模型?

在眾多領域中,例如社交網路分析、詐欺偵測、系統穩定性建模(如鐵路和能源網格)以及推薦系統,都依賴圖形作為支撐這些網路的關鍵。與傳統資料模型相比,圖形是表示互動元素群組的完美方式。在本章中,我們將介紹圖形的重要性,並探討圖形網路的基本構成要素。

圖形在現實世界中的應用

圖形資料模型在多個行業中都有廣泛的應用,包括但不限於社交網路分析、詐欺偵測和推薦系統。這些應用都依賴於圖形來描述和建模資料中各個單元之間的關係。

圖形資料模型的基本元素

圖形由節點(nodes)和邊(edges)組成,節點代表實體,邊代表實體之間的關係。圖形的屬性,例如節點和邊的屬性,可以用來描述實體和關係的特性。

節點和邊的屬性

節點和邊都可以具有屬性,用於描述其特性。例如,在一個社交網路中,節點可以代表使用者,邊可以代表使用者之間的友誼關係。節點的屬性可以包括使用者的姓名、年齡等,而邊的屬性可以包括友誼關係的建立時間等。

傳統資料函式庫與圖形資料函式庫的比較

傳統的關聯式資料函式庫(RDBs)在處理複雜的關係資料時存在侷限性。圖形資料函式庫(GDBs)則能夠更好地處理這些複雜的關係。在本文中,我們將使用Neo4j作為主要的圖形資料函式庫。

圖形在各行業的應用

圖形資料模型在多個行業中都有廣泛的應用,包括金融、醫療保健、交通運輸等。在金融領域,圖形可以用來偵測詐欺交易;在醫療保健領域,圖形可以用來分析疾病的傳播途徑。

NetworkX和igraph簡介

在本章中,我們還將介紹兩個主要的圖形套件:NetworkX和igraph。這兩個套件是目前最穩定和最受歡迎的圖形資料分析工具。

使用Python進行圖形資料建模

在接下來的章節中,我們將探討如何使用Python進行圖形資料建模。我們將介紹如何使用NetworkX和igraph這兩個套件來建立和分析圖形資料模型。

電視推薦系統案例研究

我們將透過一個電視推薦系統的案例研究來演示如何使用Python進行圖形資料建模。這個案例研究將涵蓋從資料準備到模型建立的整個過程。

資料準備

首先,我們需要準備資料。在這個案例研究中,我們將使用一個包含電視節目資訊的資料集。

import pandas as pd

# 載入資料集
data = pd.read_csv('tv_shows.csv')

# 檢視資料集的前幾行
print(data.head())

建立圖形資料模型

接下來,我們將使用NetworkX來建立一個圖形資料模型。在這個模型中,節點代表電視節目,邊代表節目之間的相似關係。

import networkx as nx

# 建立一個空的圖形
G = nx.Graph()

# 新增節點和邊
for index, row in data.iterrows():
    G.add_node(row['title'])
    for other_index, other_row in data.iterrows():
        if index != other_index and row['genre'] == other_row['genre']:
            G.add_edge(row['title'], other_row['title'])

# 檢檢視形的節點和邊
print(G.nodes())
print(G.edges())

分析圖形資料模型

最後,我們將分析建立好的圖形資料模型,以找出相似的電視節目。

# 計算節點的度
degrees = dict(G.degree())

# 找出度最大的節點
max_degree_node = max(degrees, key=degrees.get)

print(f'與其他節目最相似的節目是:{max_degree_node}')

圖表在現實世界的應用介紹

技術需求

本章節的程式碼練習將在 Jupyter Notebook 中進行。您需要安裝以下環境:

  • Python 版本需 >= 3.8.0
  • 以下套件需透過 pip install 安裝:
    • networkx==2.8.8
    • igraph==0.9.8

為什麼要使用圖表?

在現代資料驅動的解決方案和企業中,圖表資料結構正變得越來越普遍。這是因為在我們現代的資料驅動世界中,事物之間的關係正變得與事物本身一樣重要,甚至更加重要。在現代產業和企業中,圖表開始變得更加普遍和強大,用於理解實體之間的關係。我認為這些關係以及它們如何連線已經變得比實體本身更重要。我們將在後續章節中透過詳細的指示來說明如何構建這些網路,以及您需要為圖表設計做出的核心考慮。

圖表是我們每天使用的許多系統的基礎。每次您線上上收到產品推薦時,很可能是一個圖表解決方案正在為此推薦提供支援。這就是為什麼學習如何處理圖表資料和利用這些型別的網路是資料科學中一個快速增長且關鍵的技能。

圖表的基本組成部分

網路是一種用於表示複雜系統和今日資料中出現的複雜連線的工具。我們已經提到了圖表如何為一些大型強大的推薦系統提供支援。

圖表方法往往分為四個不同的領域:

  • 移動:移動關注事物如何在網路中移動(travel)。這類別圖表是路由和 GPS 解決方案背後的驅動力,並被最大的玩家用於在道路網路中找到最佳路徑。
  • 影響力:在社交媒體上,這個領域指定了已知的影響者是誰,以及他們如何在網路中傳播這種影響力。
  • 群體和互動:這個領域涉及識別群體以及網路中的參與者如何相互互動。我們將透過節點(參與者)和其連線(邊)來應用社群檢測方法,以找出這些社群。別擔心現在不懂這些術語,我們將在「節點、邊和圖表屬性的基礎知識」部分進行詳細介紹。
  • 模式檢測:模式檢測涉及使用圖表來找出網路中的相似性,這些相似性可以被探索。我們必須從參與者(節點)的角度來看待這一點,並找出該參與者與網路中其他參與者之間的相似性。在這裡,參與者可以被視為人、作者個人資料等。

節點、邊和圖表屬性的基礎知識

圖表或網路是一種特別強大的資料結構,用於建模和描述事物之間的關係,無論這些事物是人、產品還是機器。在圖表中,那些我們之前提到的事物由節點(有時稱為頂點)表示。節點透過邊(有時稱為關係)連線。在網路中,邊表示兩個事物之間的關係,表明它們以某種方式相互連線。

無向圖

為了說明這一點,一個簡單的例子是現實生活中的社交網路。在下面的例子中,Jeremy 和 Mark 各自由一個節點表示。Jeremy 是 Mark 的朋友,這種朋友關係由連線兩個節點的邊表示。下圖顯示了一個無向圖: 此圖示顯示兩個朋友節點透過一條邊連線在一起。

然而,並非所有的社交網路都是相同的,在一些線上社交媒體平台上,使用者之間的關係可能不是相互的。例如,在 Twitter 上,一個使用者可以關注另一個使用者,但這並不意味著對方也一定會關注他。

有向圖

這裡使用一個有向邊來表示 Jeremy 關注 Mark,而反方向上沒有邊則表示 Mark 沒有回關 Jeremy: 此圖示顯示兩個節點透過一條有向邊連線,表示 Jeremy 關注 Mark。

這種圖表被稱為有向圖。對於參考,有時像 圖 1.1 中的無向邊會被顯示為雙向邊,指向兩個節點。這種雙向表示在大多數情況下等同於無向邊,表示一種相互關係。

重要的是,在建立具有方向性邊的資料模型時,適當地命名關係變得非常重要。在我們的 Twitter 示例中,如果表示 Mark 和 Jeremy 之間互動的邊是「關注」(follows),那麼這條邊應該從 Jeremy 節點指向 Mark 節點。另一方面,如果邊代表「被關注」(followed by)的概念,那麼方向應該是相反的,即從 Mark 到 Jeremy。這對於一些更複雜的圖表建模和使用案例有著特別強的影響,我們將在第 2 章「使用圖表資料模型」中進行介紹。

節點屬性

雖然節點和邊(有向或無向)是圖表的基本構建塊,但它們往往不足以完全描述一個資料集。節點可以具有與其相關的資料,這些資料可能不是關係性的,因此不能表示為與另一個節點的關係。

在這些情況下,為了表示與節點相關的資料,我們可以使用節點屬性(有時稱為節點屬性)。同樣,當一條邊除了表示關係之外還有額外的資訊與其相關時,可以使用邊屬性來儲存這些資料。

下圖顯示了一條黑線,表示 Jeremy 關注 Mark,但 Mark 沒有回關 Jeremy,因此黑線表示了方向性:

內容解密:

  1. 圖表由節點組成,節點代表實體,邊代表實體間的關係。
  2. 無向圖中,邊沒有方向,表示雙向或相互的關係,如朋友關係。
  3. 有向圖中,邊具有方向,用於表示單向關係,如 Twitter 上的關注關係。
  4. 節點屬性用於儲存與節點相關的額外資訊,這些資訊不是關係性的。
  5. 正確命名有向邊對於資料模型的準確性和查詢效率至關重要。

Plantuml 圖表演示

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title Plantuml 圖表演示

rectangle "Plantuml 圖表演示" as n1
rectangle "實作" as n2
rectangle "應用" as n3

n1 --> n2
n2 --> n3

@enduml

此圖示展示了 Jeremy 關注 Mark 的有向關係。

內容解密:

  1. 使用 Plantuml 圖表工具繪製了一個簡單的有向圖。
  2. 圖中 Jeremy 節點透過一條指向 Mark 節點的有向邊,表示 Jeremy 關注 Mark。
  3. 節點樣式透過 style 命令進行了自定義,以突出顯示不同的節點。

圖形資料函式庫基礎與實務應用

在探討圖形資料函式庫(Graph Database, GDB)之前,我們先來理解圖形資料結構的基本元素:節點(Nodes)和邊(Edges),以及圖形的屬性(Properties)。這些元素共同構成了圖形資料模型,使其能夠有效地表示複雜的資料關係。

節點、邊與屬性

節點代表著資料中的實體或物件,而邊則表示這些實體之間的關係。屬性則是用於描述節點和邊的特性。例如,在 Twitter 的例子中,使用者可以被表示為節點,而他們之間的關注關係則可以被表示為邊。使用者的屬性可能包括他們的追蹤者數量、所在地等資訊。

圖 1.3 – 兩個好友節點透過一條邊連結在一起

在上述模型中,節點屬性用於描述 Mark 和 Jeremy 的追蹤者數量,以及他們在 Twitter 簡介中列出的所在地。這種額外的節點資訊對於查詢圖形資料時進行過濾至關重要。

異質圖形

當不同節點具有不同的屬性集時,通常會在同一個圖形中出現多種型別的節點。節點型別也可以被稱為層(Layers)或具有不同標籤的節點。在本文中,我們將其簡稱為型別。

圖 1.4 – 異質 Twitter 圖形的例子

現在,我們增加了代表 Mark 和 Jeremy 作為人的節點,代表他們在 Twitter 以外的關係,以及他們對各自帳戶的所有權。請注意,由於我們增加了節點型別,因此也需要新的邊型別來指代不同型別節點之間的不同互動。

具有多種節點型別的圖形被稱為異質(Heterogeneous)、多層(Multilayer)或多級(Multilevel)圖形。在本文中,我們將使用異質這個術語來指代具有多種型別節點的圖形。相對地,只有一種節點型別的圖形,如前面的例子,被稱為同質(Homogeneous)圖形。

結構設計

此時,有一個合理的問題:資料集的哪些特徵應該被表示為節點、邊和屬性?

對於任何給定的資料集,都有多種方法將資料表示為圖形,每種方法都更適合不同的目的。這就是良好的圖形建模的訣竅:根據問題或使用案例進行結構設計。

圖 1.5 – 將位置屬性從節點屬性移動到節點型別

如果我們對 Twitter 使用者在網路中的位置特別感興趣,那麼我們可以將 Twitter 使用者節點上的位置節點屬性移動,以建立 LOCATED_IN 關係型別。我們甚至可以進一步將每個位置相關的國家表示為一個單獨的抽象節點。

比較關聯式資料函式庫與圖形資料函式庫

關聯式資料函式庫(Relational Databases, RDBs)長期以來一直是大多數行業中資料儲存和資料分析的標準。它的優勢在於能夠儲存多個不同資訊表格,其中一些表格欄位可以在表格之間進行資料連結。

圖 1.6 – 列車及其停靠站的關聯式資料結構

在關聯式資料函式庫結構中,檢索所有停靠特定車站的列車並不困難。另一方面,傳回兩站之間可乘坐的列車序列可能是一個緩慢的操作。

考慮在傳統的關聯式資料函式庫中查詢 Truro 和 Glasgow Central 之間的路線所需的步驟。從 Truro 開始,我們知道 GW1426 列車服務停靠 Truro、Liskeard 和 Plymouth。知道這些車站可以從 Truro 到達,我們需要找出哪些列車服務停靠在每個車站,以找到我們的路線。

圖 1.7 – 列車及其停靠站的圖形資料結構

使用圖形結構來表示這個列車網路,更強調了資料點之間的關係。使用圖形資料函式庫可以更有效地查詢複雜的關係,這是關聯式資料函式庫所難以做到的。

圖形資料函式庫的優勢

使用圖形結構來表示列車網路,更強調了資料點之間的關係,如下圖所示。

與關聯式資料函式庫相比,圖形資料函式庫在處理涉及多個連結關係的問題時,具有明顯的效能優勢。因此,在需要處理複雜關係的應用場景中,圖形資料函式庫是一個更好的選擇。

內容解密:

  1. 圖形資料函式庫的基本元素包括節點、邊和屬性,這些元素共同構成了圖形資料模型。
  2. 節點代表實體或物件,邊表示實體之間的關係,屬性則用於描述節點和邊的特性。
  3. 異質圖形是指具有多種型別節點的圖形,這些節點具有不同的屬性和關係。
  4. 結構設計是根據問題或使用案例進行的,需要考慮哪些特徵應該被表示為節點、邊和屬性。
  5. 圖形資料函式庫在處理涉及多個連結關係的問題時,具有明顯的效能優勢。