圖形資料函式庫近年來興起,因其能有效處理關聯資料而備受關注。不同於傳統關聯式資料函式庫,圖形資料函式庫以節點和關係為核心,更貼近真實世界資料的表達方式。這使得圖形資料函式庫在社交網路分析、推薦系統、知識圖譜等領域展現出強大的優勢。理解 Cypher 查詢語言是使用圖形資料函式庫的關鍵,其語法簡潔易懂,能快速上手進行複雜的圖形遍歷和模式匹配。此外,Neo4j 作為領先的圖形資料函式庫,提供了豐富的功能和工具,進一步提升了圖形資料的處理效率。
圖形資料函式庫
圖形資料函式庫是一種能夠高效儲存和查詢圖形結構資料的資料函式庫。圖形資料函式庫的核心是節點和關係,節點代表實體,關係代表實體之間的連線。
Cypher 查詢語言
Cypher 是一種用於圖形資料函式庫的查詢語言。Cypher 的核心是 MATCH
子句,用於查詢圖形資料函式庫中的模式。
基本查詢
以下是基本的 Cypher 查詢:
MATCH (n)
RETURN (n)
這個查詢會傳回圖形資料函式庫中的所有節點。
合併查詢
合併查詢可以用於建立或匹配圖形資料函式庫中的模式。以下是合併查詢的例子:
MERGE (london:Place {city:'London', country:'UK'})
MERGE (fred:Person {name:'Fred'})
MERGE (fred)-[:LIVES_IN]->(london)
這個查詢會建立或匹配代表倫敦的節點,代表 Fred 的節點,以及 Fred 和倫敦之間的 LIVES_IN
關係。
區域性查詢
區域性查詢可以用於查詢圖形資料函式庫中的特定模式。以下是區域性查詢的例子:
MATCH (p:Person)-[:LIVES_IN]->(:Place {city:'Berlin', country:'DE'})
RETURN (p)
這個查詢會傳回所有住在柏林的 Person 節點。
好友關係查詢
以下是查詢 Rosa 的好友關係的例子:
MATCH (:Person {name:'Rosa'})-[:FRIEND*2..2]->(fof:Person)
RETURN (fof)
這個查詢會傳回所有與 Rosa 有兩層好友關係的 Person 節點。
圖形資料函式庫優勢
圖形資料函式庫具有以下優勢:
- 高效儲存和查詢圖形結構資料
- 支援複雜查詢和模式匹配
- 能夠高效處理大規模資料
圖表翻譯:
以下是對 Cypher 查詢語言的圖表翻譯:
graph LR A[節點] --> B[關係] B --> C[模式匹配] C --> D[查詢結果]
這個圖表展示了 Cypher 查詢語言的基本流程:節點和關係組成圖形資料函式庫,模式匹配用於查詢特定模式,查詢結果傳回匹配的節點和關係。
圖資料函式庫查詢語言
在圖資料函式庫中,查詢語言是用於存取和操作圖資料的重要工具。Cypher是Neo4j圖資料函式庫的一種查詢語言,它允許使用者使用簡單的語法來查詢和操作圖資料。
查詢語法
Cypher的查詢語法非常簡單和直觀。以下是一個基本的查詢範例:
MATCH (n:Person {name: 'Rosa'})-[:FRIEND*2..2]->(fof:Person)
WHERE n <> fof
RETURN fof
這個查詢查詢Rosa的朋友的朋友,並傳回結果。
WHERE子句
WHERE子句用於過濾查詢結果。例如:
MATCH (n:Person {name: 'Rosa'})-[:FRIEND*2..2]->(fof:Person)
WHERE n <> fof AND fof.name STARTS WITH 'F'
RETURN fof
這個查詢查詢Rosa的朋友的朋友,並傳回只有名字以F開頭的結果。
圖全域查詢
圖全域查詢是指查詢整個圖資料函式庫,而不僅僅是某個特定的節點或關係。例如:
MATCH (p:Place)<-[:LIVES_IN]-(person:Person)
RETURN p.name, COUNT(person) AS count
ORDER BY count DESC
這個查詢查詢所有城市,並傳回每個城市居住的人數,按人數降序排列。
效能最佳化
Neo4j的查詢語言Cypher具有非常好的效能最佳化能力。它可以根據查詢陳述式自動最佳化查詢計畫,減少查詢時間和資源消耗。
mermaid 圖表
graph LR A[Rosa] -->|FRIEND|> B[Karl] B -->|FRIEND|> C[Fred] C -->|FRIEND|> D[玄貓] D -->|LIVES_IN|> E[Berlin]
圖表翻譯
這個圖表展示了Rosa、Karl、Fred和玄貓之間的朋友關係,以及玄貓居住在Berlin的事實。
圖解 Cypher 查詢語言
Cypher 是 Neo4j 中使用的查詢語言,用於查詢和操作圖資料函式庫中的資料。以下是 Cypher 的一些基本概念和查詢示例。
MATCH 子句
MATCH 子句用於指定查詢的模式,例如查詢某個節點或關係。例如:
MATCH (p:Person {name: 'Fred'})
這個查詢查詢所有名稱為 “Fred” 的 Person 節點。
RETURN 子句
RETURN 子句用於指定查詢傳回的資料。例如:
MATCH (p:Person {name: 'Fred'})
RETURN p AS person
這個查詢傳回所有名稱為 “Fred” 的 Person 節點,並將其別名為 “person”。
ORDER BY 子句
ORDER BY 子句用於排序查詢結果。例如:
MATCH (p:Person {name: 'Fred'})
RETURN p AS person
ORDER BY person.name DESC
這個查詢傳回所有名稱為 “Fred” 的 Person 節點,並按名稱倒序排序。
COUNT 函式
COUNT 函式用於計算查詢結果的數量。例如:
MATCH (p:Person {name: 'Fred'})
RETURN COUNT(p) AS count
這個查詢傳回所有名稱為 “Fred” 的 Person 節點的數量。
CALL 子句
CALL 子句用於呼叫程式或函式。例如:
CALL db.schema.visualization()
這個查詢呼叫 db.schema.visualization()
程式,傳回圖資料函式庫的 schema。
EXPLAIN 和 PROFILE 子句
EXPLAIN 和 PROFILE 子句用於分析查詢的效能。例如:
EXPLAIN MATCH (p:Person {name: 'Fred'})
RETURN p AS person
這個查詢分析查詢的效能,並傳回查詢計劃。
PROFILE MATCH (p:Person {name: 'Fred'})
RETURN p AS person
這個查詢分析查詢的效能,並傳回查詢的實際執行情況。
圖解 Neo4j 內部機制
Neo4j 是一個圖資料函式庫,用於儲存和查詢圖資料。以下是 Neo4j 的一些內部機制:
圖結構儲存
Neo4j 將圖結構儲存為固定長度的記錄,包括節點和關係記錄。節點記錄包含節點的 ID 和屬性,關係記錄包含關係的 ID 和屬性。
屬性儲存
Neo4j 將屬性儲存為列表,包括節點和關係的屬性。屬性列表的頭部參照自節點或關係。
查詢處理
Neo4j 將查詢處理為兩個階段:查詢編譯和查詢執行。查詢編譯階段將查詢轉換為查詢計劃,查詢執行階段執行查詢計劃並傳回結果。
事務處理
Neo4j 支援事務處理,用於確保資料的一致性和完整性。事務處理包括開始事務、提交事務和回復事務三個階段。
圖解 APOC 函式庫
APOC 函式庫是 Neo4j 中的一個函式庫,提供了許多有用的函式和程式,用於操作圖資料。以下是 APOC 函式庫的一些功能:
串接屬性
APOC 函式庫提供了串接屬性的函式,用於將多個屬性串接成一個字串。例如:
MATCH (p:Person {name: 'Fred'})
RETURN apoc.text.join([p.name, p.age], ' ') AS result
這個查詢傳回 “Fred 30” 字串。
日期時間轉換
APOC 函式庫提供了日期時間轉換的函式,用於將日期時間轉換為不同的格式。例如:
MATCH (p:Person {name: 'Fred'})
RETURN apoc.date.format(p.birthdate, 'yyyy-MM-dd') AS result
這個查詢傳回 “1990-01-01” 字串。
資料載入知識圖譜
在上一章中,您已經學習了圖資料函式庫和查詢語言,甚至瞭解了一些資料函式庫的內部工作原理。您還學習瞭如何查詢和更新知識圖譜。但是,有一種特殊的情況需要更多的深入探討:批次匯入,這對於整個知識圖譜的生命週期都很有用。
為了確保匯入過程的順暢,建議從小規模開始。先選取一部分代表性的資料,匯入到資料函式庫中,然後檢查模型是否按預期工作。在進行完整的匯入工作之前,這樣做可以節省您數分鐘或甚至數小時的挫折時間。
在本章中,您將學習三種將資料批次載入知識圖譜的方法。您將學習如何將大量資料增量式地載入活躍的知識圖譜,以及如何使用大量資料來初始化知識圖譜。但在此之前,您將學習如何使用圖形工具來定義知識圖譜的結構,並將資料對映到該結構上以進行批次匯入。
使用 Neo4j 資料匯入工具載入資料
您應該先使用三種流行的 Neo4j 批次資料匯入工具中最簡單的一種。Neo4j 資料匯入工具是一種視覺化工具,允許您繪製您的域模型作為一個圖表,然後使用包含節點和關係資料的 CSV 檔案將資料疊加到該圖表上。
資料匯入工具大大簡化了啟動知識圖譜的過程,特別是對於初學者。然而,它仍然需要您事先準備好 CSV 檔案中的資料。
為了保持範例簡潔,本章使用了第 1 章和第 3 章中出現的社交網路資料。請注意,這個簡單的範例有效,但實際匯入往往使用更大的檔案!
首先,繪製社交網路。圖 4-1 顯示了域模型,由 Person 和 Place 節點以及 FRIEND 和 LIVES_IN 關係組成。
接下來,新增 CSV 檔案,如範例 4-1、4-2、4-3 和 4-4 所示,使用簡單的繪圖工具繪製節點和關係,並使用右側的對映詳細資訊面板進行註解。
範例 4-1 顯示了 people.csv 中 Person 節點的資料。
:ID(Person),name
23,Rosa
42,Karl
55,Fred
在範例 4-1 中,節點的 ID 和標籤指定為 :ID(Person),具有單個屬性名稱。在後續的行中,您可以看到符合該模式的資料,例如 23,Rosa。請注意,ID 欄位稍後用於連線圖表,不一定是域模型的一部分,可以在稍後從模型中刪除。
範例 4-2 顯示了 friends.csv 中 Person 節點之間的 FRIEND 關係。
:START_ID(Person),:END_ID(Person)
23,42
42,23
這些範例展示瞭如何使用 Neo4j 資料匯入工具將資料載入知識圖譜。透過這種方式,您可以輕鬆地初始化知識圖譜,並開始探索和分析您的資料。
使用Neo4j Data Importer和LOAD CSV載入知識圖資料
在前面的章節中,我們已經瞭解瞭如何使用Cypher命令建立和更新記錄。現在,我們將探討如何使用Neo4j Data Importer和LOAD CSV命令載入大量資料到知識圖中。
使用Neo4j Data Importer
Neo4j Data Importer是一個視覺化工具,允許您輕鬆地將CSV資料載入到Neo4j圖資料函式庫中。它可以自動生成Cypher程式碼,並執行載入資料的過程。
首先,您需要準備好CSV檔案,包含您想要載入的資料。例如,您可以建立一個名為people.csv
的檔案,包含以下內容:
:ID(Person),name,age
1,John,25
2,Jane,30
3,Bob,35
接下來,您需要建立一個名為places.csv
的檔案,包含以下內容:
:ID(Place),city,country
1,Berlin,Germany
2,London,UK
3,Paris,France
然後,您需要建立一個名為lives_in.csv
的檔案,包含以下內容:
:START_ID(Person),:END_ID(Place),since
1,1,2020
2,2,2019
3,3,2018
現在,您可以使用Neo4j Data Importer將這些CSV檔案載入到Neo4j圖資料函式庫中。您需要指定載入的資料來源、目標圖資料函式庫和認證資訊。
一旦載入完成,您就可以在Neo4j圖資料函式庫中檢視載入的資料。您也可以使用Cypher命令查詢和分析載入的資料。
使用LOAD CSV
LOAD CSV是一個Cypher命令,允許您從CSV檔案中載入資料到Neo4j圖資料函式庫中。它比Neo4j Data Importer更靈活,因為您可以使用Cypher命令控制載入的過程。
例如,您可以使用以下Cypher命令載入places.csv
檔案中的資料:
LOAD CSV WITH HEADERS FROM 'places.csv' AS line
MERGE (p:Place {id: line.id, city: line.city, country: line.country})
這個命令會載入places.csv
檔案中的資料,並將其合併到Neo4j圖資料函式庫中的Place節點中。
您也可以使用LOAD CSV命令載入lives_in.csv
檔案中的資料:
LOAD CSV WITH HEADERS FROM 'lives_in.csv' AS line
MATCH (p:Person {id: line.start_id}), (l:Place {id: line.end_id})
MERGE (p)-[:LIVES_IN {since: line.since}]->(l)
這個命令會載入lives_in.csv
檔案中的資料,並將其合併到Neo4j圖資料函式庫中的Person和Place節點之間的LIVES_IN關係中。
比較Neo4j Data Importer和LOAD CSV
Neo4j Data Importer和LOAD CSV都是用於載入知識圖資料的工具,但是它們有不同的優點和缺點。
Neo4j Data Importer是一個視覺化工具,易於使用和理解。它可以自動生成Cypher程式碼,並執行載入資料的過程。然而,它可能不夠靈活,無法控制載入的過程。
LOAD CSV是一個Cypher命令,更加靈活和強大。它允許您控制載入的過程,並可以使用Cypher命令查詢和分析載入的資料。然而,它需要更多的技術知識和經驗。
因此,選擇哪一個工具取決於您的具體需求和經驗。如果您是初學者,Neo4j Data Importer可能是更好的選擇。如果您需要更多的控制和靈活性,LOAD CSV可能是更好的選擇。
第四章:載入知識圖譜資料
在本章中,我們將探討如何使用Neo4j的LOAD CSV命令將資料載入知識圖譜。LOAD CSV是一個強大的工具,允許您將CSV檔案中的資料載入圖譜中。
載入資料
要載入資料,首先需要準備好您的CSV檔案。例如,假設您有一個名為people.csv
的檔案,內容如下:
name,gender,age
Rosa,f,
Karl,,64
Fred,,
您可以使用以下Cypher查詢來載入這些資料:
LOAD CSV WITH HEADERS FROM 'people.csv' AS line
MERGE (p:Person {name: line.name})
SET p.age = line.age
SET p.gender = line.gender
這個查詢會將每一行的資料與一個Person節點進行合併,如果節點不存在則會建立一個新的節點。然後,會設定節點的age和gender屬性。
處理不規則資料
在實際應用中,資料可能不規則,例如有些欄位可能不存在。為了處理這種情況,您可以使用SET命令來避免寫入null屬性。例如:
LOAD CSV WITH HEADERS FROM 'people.csv' AS line
MERGE (p:Person {name: line.name})
SET p.age = line.age
SET p.gender = line.gender
這個查詢會設定節點的age和gender屬性,但如果對應的欄位不存在,則不會寫入null屬性。
載入關係
除了載入節點外,您還可以使用LOAD CSV來載入關係。例如,假設您有一個名為friend_rels.csv
的檔案,內容如下:
from,to
Rosa,Karl
Karl,Rosa
Karl,Fred
Fred,Karl
您可以使用以下Cypher查詢來載入這些關係:
LOAD CSV WITH HEADERS FROM 'friend_rels.csv' AS line
MATCH (p1:Person {name:line.from}), (p2:Person {name:line.to})
MERGE (p1)-[:FRIEND]->(p2)
這個查詢會將每一行的資料與兩個Person節點進行匹配,如果關係不存在則會建立一個新的關係。
載入批次
對於大規模的資料載入,您可以使用批次來避免資料函式庫過載。Neo4j 4.4之後,您可以使用CALL命令來執行批次操作。例如:
LOAD CSV WITH HEADERS FROM 'people.csv' AS line
CALL {
WITH line
MERGE (p:Person {name: line.name})
SET p.age = line.age
SET p.gender = line.gender
} IN TRANSACTIONS OF 1 ROWS
這個查詢會將每一行的資料載入圖譜中,並且每次只執行一行的操作。
初步大量資料匯入
在建立知識圖的初始階段,通常需要匯入大量的資料。雖然可以使用Neo4j Data Importer或LOAD CSV來進行匯入,但有一種更快速的方法,雖然它比較低階。
Neo4j的命令列工具neo4j-admin內建了一個離線匯入功能。neo4j-admin import命令可以從一組CSV檔案建立一個新的Neo4j資料函式庫。(更多詳細資訊,可以參考neo4j-admin import的完整教程。)
neo4j-admin工具可以非常快速地匯入資料,平均每秒可處理約一百萬筆記錄,並且對於高效能儲存裝置如SSD和儲存區域網路(SAN)進行了最佳化。這是一種高效能的方法,可以用於建立大量的匯入資料到知識圖中,但需要注意的是,每次執行此命令時,資料函式庫都必須是離線的。
禁止使用neo4j-admin import的注意事項
使用neo4j-admin import有個限制,那就是它是一個離線匯入工具,這也是為什麼它能夠如此快速的原因。資料函式庫在匯入完成後即可供查詢,但是在匯入過程中,資料函式庫將不可用。
使用neo4j-admin import
要使用neo4j-admin import,首先需要將您的資料整理成CSV檔案,並將它們放在neo4j-admin import可以存取的檔案系統中。檔案系統不一定需要是本地的,可以是網路掛載。然而,它必須是一個檔案系統,因為neo4j-admin import不會從例如S3儲存桶或其他非檔案系統的資料儲存中讀取資料。由於資料量可能很大,工具也支援壓縮(gzipped)的CSV檔案。
最低限度,匯入工具需要以獨立的檔案形式提供節點和關係的CSV檔案。然而,最佳實踐是為不同型別的節點和關係建立獨立的CSV檔案,例如將Person和Place節點以及FRIEND和LIVES_IN關係分開。
非常大的檔案應該分割成多個小檔案,並且CSV標頭應該放在一個單獨的檔案中。這使得編輯大檔案變得容易,因為小檔案更方便進行文字編輯。
範例:people.csv
:ID(Person),name
23,Rosa
42,Karl
55,Fred
如範例所示,這是一個包含Person節點ID和name屬性的CSV檔案。:ID(Person)
表示此欄位代表節點的ID,且節點具有Person標籤。與Neo4j Data Importer類別似,ID不一定是域模型的一部分,但由neo4j-admin import使用。
範例:friends_header.csv、friends1.csv和friends2.csv
:START_ID(Person),:END_ID(Person)
23,42
42,23
42,55
55,42
這些範例示範瞭如何分割FRIEND關係的CSV檔案。friends_header.csv
包含關係資料的簽名,而friends1.csv
和friends2.csv
包含實際的關係資料。這種分離使得資料操作變得更加容易,因為修改標頭不需要開啟一個非常大的檔案。
範例:places_header.csv、places1.csv和places2.csv
:ID(Place), city, country
143,Berlin,Germany
244,London,UK
這些範例示範瞭如何定義Place節點的CSV檔案。places_header.csv
包含Place節點的簽名,而places1.csv
和places2.csv
包含實際的節點資料。
範例:people_places.csv
:START_ID(Person),:END_ID(Place),since
這個範例示範瞭如何定義Person節點和Place節點之間的LIVES_IN關係,包括一個可選的since屬性。
圖表翻譯:
graph LR A[people.csv] --> B[neo4j-admin import] B --> C[Neo4j Database] C --> D[Knowledge Graph] D --> E[Query]
此圖表展示瞭如何使用neo4j-admin import將people.csv匯入Neo4j Database,然後建立知識圖,並最終執行查詢。
整合知識圖與資訊系統
知識圖是一種強大的工具,但其真正的價值在於與其他系統整合。當知識圖與其他系統整合時,它可以豐富其他系統,並反過來被其他系統豐富。有多種方法可以將知識圖整合到您的資料架構中,本章將引導您透過一些流行的選擇。這些選擇包括客戶端資料函式庫驅動程式、自訂函式和程式、API、串流中介軟體和ETL(抽取、轉換、載入)工具。
圖形資料函式庫正逐步成為處理關聯資料的核心技術。深入剖析 Neo4j 的 Cypher 查詢語言、資料匯入工具以及底層架構,可以發現其在處理複雜關聯查詢上的顯著優勢,尤其在社交網路、知識圖譜等領域。技術限制深析顯示,neo4j-admin import 雖然高效,但離線匯入的特性限制了其在需要即時資料更新的場景下的應用。權衡效能與靈活性,LOAD CSV 與 Data Importer 提供了更彈性的資料載入方式,更適用於持續更新的知識圖譜。展望未來,圖形資料函式庫與其他資訊系統的深度整合將是重要的發展方向,預計將出現更多標準化的整合方案和工具。玄貓認為,對於需要處理高度互連資料的應用,圖形資料函式庫已展現出足夠的成熟度,值得技術團隊深入研究並整合至其技術堆積疊中。