圖資料函式庫在處理複雜關係資料方面展現出強大能力,相較於傳統關聯式資料函式庫,更能有效地連結和探索資料。理解圖結構的基礎概念,包含頂點、邊和屬性,是應用圖資料函式庫的關鍵。圖形架構的設計,決定了資料函式庫的組織方式,並影響查詢效率。透過圖形遍歷,我們能有效探索資料點之間的關係,例如找出電影產業中演員和導演的合作網路。不同於關聯式資料函式庫需要透過連線表進行跨表查詢,圖資料函式庫能直接展現資料元素之間的關聯性,大幅提升查詢效率。此外,圖形結構的靈活性,讓我們能輕鬆新增新的頂點和邊型別,以適應不同資料建模需求,例如在電影資料函式庫中加入角色、型別等資訊,進而進行更深入的分析。
連線與探索資料
在第一章中,我們展示了圖形分析與機器學習在人類和商業努力中的潛力,並提出將詳細內容分為三個階段呈現:連線資料的力量、圖形分析的力量和圖形機器學習的力量。在本章中,我們將探討第一階段:連線資料的力量。
在探討連線資料的力量之前,我們需要奠定一些基礎。我們首先介紹圖形資料模型的概念和術語。如果你已經熟悉圖形,你可能需要瀏覽本文,以確保我們在術語上達成共識。除了圖形本身,我們還將介紹圖形架構和遍歷圖形的重要概念。遍歷是我們在圖形中搜尋資料和連線的方式。
在這個過程中,我們還將討論圖形和關聯式資料函式庫之間的差異,以及如何使用圖形分析提出問題和解決問題,而這些在關聯式資料函式庫中是不可行的。
從對圖形的基本理解出發,我們將透過展示圖形資料提供比表格資料更多的洞察力和分析能力的六種方式,來說明圖形資料的力量。
完成本章後,您應該能夠:
- 使用描述圖形的標準術語
- 瞭解圖形架構和圖形例項之間的差異
- 從頭開始或從關聯式資料函式庫模型建立基本的圖形模型或架構
- 應用“遍歷”隱喻來搜尋和探索圖形資料
- 瞭解圖形資料增強知識和分析能力的六種方式
- 說明實體解析問題,並展示圖形如何解決這個問題
圖形結構
在第一章中,我們向您介紹了圖形的基本概念。在本文中,我們將更深入地探討。首先,我們將建立本文其餘部分將使用的術語。然後,我們將更多地討論圖形架構的概念,這是對資料結構進行規劃和意識的關鍵。
圖形術語
假設您正在整理有關電影、演員和導演的資料。也許您為Netflix或其中一家串流媒體服務工作,或者您只是一個粉絲。
讓我們從一部電影《星球大戰:新希望》、它的三位主要演員和導演開始。如果您在關聯式資料函式庫中建立這個資訊,您可以在一個表中記錄這個資訊,但是這個表會迅速增長並迅速變得難以管理。我們如何在一張表中記錄有關一部電影、50名演員出演的資訊,以及每位演員的職業生涯細節?
關聯式資料函式庫設計的最佳實踐建議將演員、電影和導演分別放入不同的表中,但這需要新增交叉參照表來處理演員和電影之間以及電影和導演之間的多對多關係。
因此,總共需要五個表才能在關聯式資料函式庫中表示這個例子,如圖2-1所示。
graph LR; A[電影] --> B[演員]; A --> C[導演]; B --> D[交叉參照表]; C --> D;
圖表翻譯: 此圖示展示了關聯式資料函式庫中的表格結構,包括電影、演員和導演之間的關係。
將不同型別的事物分成不同的表是組織資料的正確方法,但要檢視一個記錄與另一個記錄之間的關係,我們必須重新連線資料。查詢哪些演員與哪些導演合作,需要在記憶體中建立一個臨時表,稱為連線表,其中包括所有可能的跨錶行組合,這些組合滿足查詢條件。
連線表在記憶體和處理器時間方面都很昂貴。
圖形結構的優勢
然而,如果我們將其與圖形方法進行比較,如圖2-3所示,有一點立即變得清晰:表和圖形的區別在於,圖形可以直接顯示一個資料元素與另一個資料元素的關聯。也就是說,資料點之間的關係被構建到資料函式庫中,而不必在執行時構建。因此,圖形和關聯式資料函式庫之間的一個關鍵區別在於,在圖形資料函式庫中,資料點之間的關係是明確的。
graph LR; A[Star Wars: 新希望] --> B[Mark Hamill]; A --> C[Carrie Fisher]; A --> D[Harrison Ford]; E[George Lucas] --> A;
圖表翻譯: 此圖示展示了有關星球大戰的基本資訊,包括演員和導演之間的關係。
每個演員、電影和導演都稱為節點或頂點(複數:頂點)。頂點代表事物,無論是物理的還是抽象的。在我們的例子中,圖形有五個頂點。
頂點之間的連線稱為邊緣,它們描述了頂點之間的關係。邊緣也被視為資料元素。該圖形有四個邊緣:三個用於演員,顯示他們與電影的關係(acted_in),一個用於導演,顯示他們與電影的關係(directed_by)。在其最簡單的形式中,圖形是頂點和邊緣的集合。我們將使用通用術語“物件”來指代頂點或邊緣。
利用這個圖形,我們可以回答一個基本問題:哪些演員與導演喬治·盧卡斯合作過?從喬治·盧卡斯開始,我們檢視他執導的電影,其中包括《星球大戰》,然後檢視該電影中的演員,其中包括馬克·哈米爾、凱莉·費舍爾和哈里森·福特。
圖形遍歷
區分邊緣的方向可能是有用的,甚至是必要的。在圖形資料函式庫中,邊緣可以是有向或無向的。有向邊緣具有特定的方向性,從源頂點到目標頂點。我們將有向邊緣繪製為箭頭。
# 定義一個簡單的圖形結構
class Vertex:
def __init__(self, name):
self.name = name
self.edges = []
def add_edge(self, edge):
self.edges.append(edge)
class Edge:
def __init__(self, target, relation):
self.target = target
self.relation = relation
# 建立頂點
star_wars = Vertex("Star Wars: 新希望")
mark_hamill = Vertex("Mark Hamill")
carrie_fisher = Vertex("Carrie Fisher")
harrison_ford = Vertex("Harrison Ford")
george_lucas = Vertex("George Lucas")
# 新增邊緣
star_wars.add_edge(Edge(mark_hamill, "acted_in"))
star_wars.add_edge(Edge(carrie_fisher, "acted_in"))
star_wars.add_edge(Edge(harrison_ford, "acted_in"))
george_lucas.add_edge(Edge(star_wars, "directed_by"))
#### 內容解密:
此程式碼定義了一個簡單的圖形結構,包括頂點和邊緣。頂點代表實體,邊緣代表實體之間的關係。透過新增邊緣,我們可以建立實體之間的關聯。
圖形資料模型的優勢
圖形資料模型提供了許多優勢,包括:
- 更直觀的資料表示:圖形資料模型可以直接表示實體之間的關係,使得資料更易於理解和分析。
- 更高的查詢效率:圖形遍歷可以高效地查詢實體之間的關係,而不需要進行複雜的連線操作。
- 更好的資料擴充套件性:圖形資料模型可以輕鬆地擴充套件到大規模資料,而不需要進行重大的架構變更。
圖資料函式庫與圖結構基礎
在探討圖資料函式庫的過程中,我們首先需要了解圖的基本結構以及其在資料建模中的重要性。圖資料函式庫是一種特殊的資料函式庫,它使用圖結構來儲存和查詢資料。圖結構由頂點(Vertex)、邊(Edge)和屬性(Property)組成,這些元素共同構成了圖資料函式庫的核心。
圖結構的基本元素
圖結構的基本元素包括頂點、邊和屬性。頂點代表了資料中的實體或物件,邊則代表了這些實體之間的關係。屬性則是用來描述頂點和邊的特徵。
在圖2-4中,我們可以看到一個簡單的電影圖,其中包含了《星際大戰》和《帝國反擊戰》兩部電影,以及它們之間的關係。這裡使用了有向邊來表示《帝國反擊戰》是《星際大戰》的續集。
graph LR A[星際大戰] -->|is_sequel_of|> B[帝國反擊戰]
圖表翻譯: 上圖顯示了《星際大戰》和《帝國反擊戰》之間的關係,其中有向邊is_sequel_of
表示了《帝國反擊戰》是《星際大戰》的續集。
圖結構中的屬性
屬性是圖結構中的重要元素,它們為頂點和邊提供了更多的上下文資訊。在圖2-5中,我們可以看到《星際大戰》圖中增加了更多的屬性,如電影的型別和演員的資訊。
graph LR A[星際大戰] -->|has_actor|> B[馬克·哈米爾] A -->|has_genre|> C[科幻] A -->|has_director|> D[喬治·盧卡斯]
圖表翻譯: 上圖顯示了《星際大戰》的相關資訊,包括演員、型別和導演。這種結構使得我們可以輕鬆地查詢和統計相關資料。
圖結構的靈活性
圖結構的一個重要特點是其靈活性。我們可以根據需要新增新的頂點型別和邊型別,以滿足不同的資料建模需求。在圖2-6中,我們增加了角色(Character)頂點,以表示演員所扮演的角色。
graph LR A[達斯·維德] -->|played_by|> B[大衛·普勞斯] A -->|voiced_by|> C[詹姆斯·厄爾·瓊斯]
圖表翻譯: 上圖顯示了達斯·維德這個角色由大衛·普勞斯飾演(身體)和詹姆斯·厄爾·瓊斯配音(聲音)。這種結構使得我們可以輕鬆地表示複雜的關係。
圖資料函式庫的應用
圖資料函式庫的靈活性使其在多個領域中有廣泛的應用。我們可以利用圖資料函式庫來分析電影產業中的各種關係,如演員與導演之間的合作關係、電影的型別和票房表現等。
透過構建一個包含數千部電影和相關人員的圖資料函式庫,我們可以使用圖演算法來回答諸如「某些導演最喜歡與哪些演員合作?」或「哪些專家在科幻特效領域最為擅長?」等問題。
圖結構的優勢
圖結構相比於傳統的關係型資料函式庫有著明顯的優勢。它可以更自然地表示複雜的關係,並且可以更高效地查詢和分析這些關係。
圖結構還可以作為一種搜尋索引,使得我們可以快速地找到相關的資料。例如,透過將電影型別作為一個單獨的頂點,我們可以輕鬆地找到所有科幻電影,並對它們進行統計分析。
圖結構的未來發展
隨著資料的複雜性和規模不斷增加,圖資料函式庫的重要性將越來越突出。未來,我們可以預見圖資料函式庫將在更多領域中得到應用,如社交網路分析、推薦系統和金融風險分析等。
圖結構的建模與管理
在業務環境中,要有效地建模和管理圖資料函式庫,關鍵是制定一個清晰的圖結構計劃,也就是圖結構模型(Graph Schema)。這個模型定義了圖中將包含的頂點和邊的型別,以及與這些物件相關聯的屬性。
圖結構模型的定義
圖結構模型類別似於關係型資料函式庫中的架構或實體關係模型。它為圖資料函式庫中的資料提供了一個清晰的結構,使得資料的管理和查詢變得更加容易。
在制定圖結構模型時,我們需要考慮到資料的型別和屬性。例如,在一個電影資料函式庫中,我們可能需要定義電影、演員和導演等頂點型別,以及它們之間的關係,如「出演」和「導演」等邊型別。
圖結構模型的優勢
一個良好的圖結構模型可以帶來多個好處。首先,它使得資料的管理變得更加容易,因為我們可以清晰地瞭解資料的結構和關係。其次,它提高了查詢的效率,因為我們可以根據資料的結構來最佳化查詢。
此外,圖結構模型還可以幫助我們避免資料冗餘和不一致性的問題。透過定義清晰的資料結構,我們可以確保資料的一致性和完整性。
圖結構模型的實踐
在實踐中,制定圖結構模型需要考慮多個因素,包括資料的特性、查詢的需求和業務的目標等。我們需要根據這些因素來定義合適的頂點和邊的型別,以及相關的屬性。
例如,在一個社交網路應用中,我們可能需要定義使用者、帖子和評論等頂點型別,以及使用者之間的「關注」和「好友」等關係。
graph LR A[使用者] -->|釋出|> B[帖子] A -->|評論|> C[評論] A -->|關注|> D[使用者]
圖表翻譯: 上圖顯示了使用者、帖子和評論之間的關係,包括使用者釋出帖子、評論帖子和關注其他使用者等關係。
圖資料函式庫的架構與遍歷
圖資料函式庫是一種用於儲存和查詢複雜關係資料的資料函式庫系統。在本章中,我們將探討圖資料函式庫的架構、遍歷方法以及圖建模的相關知識。
圖資料函式庫的架構
圖資料函式庫的核心是圖結構,由頂點(Vertex)和邊(Edge)組成。頂點代表實體物件或概念,而邊則代表這些實體之間的關係。
圖式設計
一個良好的圖式設計可以使資料更容易被理解和查詢。圖2-7展示了一個可能的電影圖資料函式庫架構。
圖2-7:電影圖資料函式庫架構
在此架構中:
- Person 頂點型別代表真實世界中的人物,例如喬治·盧卡斯。
- Worked_on 邊型別連線 Person 和 Movie,並具有一個屬性來描述人員的角色,如導演、製片人、演員等。透過將角色作為屬性,我們可以支援任意數量的角色,而無需建立多個頂點型別或邊型別。
- Character 頂點型別與 Person 頂點型別是分開的,因為一個 Person 可以扮演多個 Character,或者多個 Person 可以扮演一個 Character。
- Movie 頂點型別代表電影。
- Is_sequel_of 是一種有向邊型別,用於表示源 Movie 是目標 Movie 的續集。
- Genre 被建模為頂點型別,而不是屬性,以便更容易地過濾和分析不同型別的電影。
CREATE VERTEX Person (id INT, name STRING) PRIMARY KEY id;
CREATE VERTEX Movie (id INT, title STRING) PRIMARY KEY id;
CREATE VERTEX Character (id INT, name STRING) PRIMARY KEY id;
CREATE VERTEX Genre (id INT, name STRING) PRIMARY KEY id;
CREATE UNDIRECTED EDGE Worked_on (role STRING) CONNECTING (Person, Movie);
CREATE DIRECTED EDGE Is_sequel_of CONNECTING (Movie, Movie);
CREATE UNDIRECTED EDGE Portrays CONNECTING (Person, Character);
CREATE UNDIRECTED EDGE Belongs_to CONNECTING (Movie, Genre);
內容解密:
- 上述GSQL(Graph SQL)程式碼片段展示瞭如何為電影圖資料函式庫建立頂點和邊型別。
CREATE VERTEX
陳述式用於建立不同型別的頂點,如 Person、Movie、Character 和 Genre。CREATE EDGE
陳述式用於建立不同型別的邊,如 Worked_on、Is_sequel_of、Portrays 和 Belongs_to。- 這些頂點和邊型別的定義有助於建立一個結構化的圖資料函式庫,以便進行高效的查詢和遍歷。
圖遍歷
圖遍歷是圖資料函式庫查詢的核心操作,涉及在圖結構中導航以檢索或分析資料。圖遍歷可以比喻為在一個由踏石組成的路徑上移動,每塊踏石代表一個頂點,而路徑則由邊連線。
跳躍與距離
在圖遍歷中,每次跨越一條邊都被稱為一次「跳躍」。圖2-8展示了圖遍歷的概念,可以將其視為在一個遊戲板上移動。
圖2-8:圖遍歷就像在遊戲板上移動
圖遍歷在許多現實場景中都有應用,例如「六度分隔理論」,該理論認為,美國的任何人都可以透過最多六次人際關係與其他人聯絡起來。
遍歷方法
圖資料函式庫中的遍歷方法主要分為兩種:
- 廣度優先搜尋(BFS):先存取當前頂點的所有鄰居頂點,然後再存取下一層鄰居。這種方法適合用於平行處理,可以加速查詢。
- 深度優先搜尋(DFS):沿著一條路徑盡可能深入地遍歷,直到無法繼續,然後回溯並嘗試其他路徑。
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
vertex = queue.popleft()
print(vertex, end=" ")
for neighbor in graph[vertex]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=" ")
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
# 示例圖結構
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
print("廣度優先搜尋:")
bfs(graph, 'A')
print("\n深度優先搜尋:")
dfs(graph, 'A')
內容解密:
- 上述Python程式碼展示瞭如何實作廣度優先搜尋(BFS)和深度優先搜尋(DFS)。
- BFS使用佇列來儲存待存取的頂點,而DFS則使用遞迴或堆積疊來實作。
- 這些遍歷方法可以用於在圖資料函式庫中執行搜尋和查詢操作。
圖建模
圖建模是設計圖資料函式庫的關鍵步驟,涉及確定哪些實體和關係需要被建模。
圖式設計選項和權衡
在設計圖資料函式庫時,需要考慮輸入資料的格式和查詢使用案例。一個良好的圖式設計需要在記憶體使用和查詢效能之間取得平衡。
- 頂點、邊還是屬性?:在將表格資料轉換為圖時,需要決定哪些列應該對映到頂點、邊或屬性。
- 邊的方向性:邊可以是有向或無向的。選擇適當的邊方向性可以影響查詢效能和資料模型的複雜度。
-- 將屬性建模為頂點
CREATE VERTEX Color (id INT, name STRING) PRIMARY KEY id;
CREATE UNDIRECTED EDGE Has_color CONNECTING (Product, Color);
-- 將屬性建模為屬性
CREATE VERTEX Product (id INT, color STRING) PRIMARY KEY id;
內容解密:
- 上述GSQL程式碼展示了兩種不同的圖建模方法:將屬性(如顏色)建模為頂點,或將其建模為頂點的屬性。
- 將顏色建模為頂點可以提高查詢效能,因為可以直接遍歷與特定顏色相關的產品。
- 將顏色建模為屬性則更直觀,但可能需要遍歷所有產品頂點來查詢特定顏色的產品。
綜上所述,圖資料函式庫的架構設計和遍歷方法是圖資料管理的關鍵。透過合理的圖建模和遍歷策略,可以有效地儲存、查詢和分析複雜的關係資料。透過上述範例與程式碼的展示,我們能夠更深入地理解圖資料函式庫的設計與應用。