使用圖資料庫 Nebula Graph 資料匯入快速體驗知識圖譜 OwnThink
前言
本文由 Nebula Graph 實習生@王傑貢獻。
最近 @Yener 開源了史上最大規模的中文知識圖譜——OwnThink(連結:https://github.com/ownthink/KnowledgeGraphData ),資料量為 1.4 億條。
本文介紹如何將這份資料快速匯入圖資料庫 Nebula Graph,全過程大約需要 30 分鐘。
中文知識圖譜 OwnThink 簡介
思知(OwnThink)
知識圖譜是由 Google 在 2012 年提出來的一個概念。主要是用來描述真實世界中存在的各種實體和概念,以及他們之間的關係。在搜尋引擎、問答機器人、知識抽取等多個領域有著諸多應用。
最近 Yener 開源了史上最大規模的中文知識圖譜—— OwnThink(連結:https://github.com/ownthink/KnowledgeGraphData),資料量為 1.4 億條。資料以 (實體, 屬性, 值)
和 (實體, 關係, 實體)
混合的三元組形式儲存,資料格式為 csv。
可以點選這裡下載:https://nebula-graph.oss-accelerate.aliyuncs.com/ownthink/kg_v2.tar.gz
檢視原始檔案
由於 ownthink_v2.csv 資料過多,摘錄部分資料為例:
紅色食品,描述,紅色食品是指食品為紅色、橙紅色或棕紅色的食品。
紅色食品,是否含防腐劑,否
紅色食品,主要食用功效,預防感冒,緩解疲勞
紅色食品,用途,增強表皮細胞再生和防止皮膚衰老
大龍湫,描述,雁蕩山景區分散,東起羊角洞,西至鋸板嶺;南起筋竹溪,北至六坪山。
大龍湫,中文名稱,大龍湫
大龍湫,外文名稱,big dragon autrum
大龍湫,門票價格,50元
大龍湫,著名景點,芙蓉峰
姚明[中國籃球協會主席、中職聯公司董事長],妻子,葉莉
這裡的 (紅色食品,是否含防腐劑,否)
就是典型的 (實體, 屬性, 值)
形式的三元組資料; 而 (姚明[中國籃球協會主席、中職聯公司董事長],妻子,葉莉)
是典型的 (實體, 關係, 實體)
形式的三元組資料。
Step 1. 資料建模與清洗準備
建模
Nebula Graph 是一個開源的分散式圖資料庫(連結:https://github.com/vesoft-inc/nebula),相比 Neo4j 來說,它的主要特點是完全的分散式,因此圖資料庫 Nebula Graph 適合處理資料量超過單機的場景。
圖資料庫通常支援的資料模型為有向屬性圖(directed property graph)。圖中的每個頂點(vertex)可以用標籤(tag)來表示型別(Neo4j 叫做 Label),頂點和頂點之間的關係用邊(edge)連線起來。每種 tag 和 edge 還可以帶有屬性。——然而,這些功能對於知識圖譜的三元組資料沒什麼意義:
分析上圖的三元組資料,發現無論是 (實體, 屬性, 值)
形式的三元組資料,還是 (實體, 關係, 實體)
形式的三元組資料,每條三元組資料均可以建模成兩個點和一條邊的形式。前者三元組中的“實體”和“值”建模為兩個點(起點、終點),“屬性”建模為一條邊,後者三元組中的兩個“實體”也建模為兩個點(起點、終點),“關係”建模為一條邊.
而且,所有的點都是相同型別(取名叫entity
),只需要一個屬性(叫 name
),所有的邊也都是同一型別(取名叫 relation
),邊上也只有一個屬性(叫 name
)。
比如 (大龍湫,著名景點,芙蓉峰)
可以表示成下圖這個樣子:
資料清洗和預處理
按照前一節的分析,原始的每條三元組資料,還需要清洗轉換為兩個點和一條邊才能變成屬性圖的模型。
下載清洗工具
本文測試的時候,使用的作業系統是 CentOS 7.5,工具由 Golang 語言編寫而成。
你可以在這裡 (連結:https://github.com/jievince/rdf-converter) 下載這個簡單的清洗工具原始碼並編譯使用。
該工具會把轉換後的頂點的資料寫入到 vertex.csv 檔案、邊資料寫入到 edge.csv 檔案。
說明:在測試過程中,發現有大量的重複點資料,所以工具裡面也做了去重。完全去重後的點的資料大概是 4600 萬條,完全去重後的邊的資料大概是 1 億 4000 萬條。
清洗完的 vertex.csv
檔案長這樣:
-2469395383949115281,過度包裝
-5567206714840433083,Over Package
3836323934884101628,有的商品故意增加包裝層數
1185893106173039861,很多采用實木、金屬製品
3455734391170888430,非科學
9183164258636124946,教育
5258679239570815125,成熟市場
-8062106589304861485,"成熟市場是指低增長率,高佔有率的市場。"
說明:每一行是一個頂點,第一列整型 -2469395383949115281
是頂點的 ID(叫做 VID
),它是由第二列文字通過 hash
計算出來的,例如 -2469395383949115281
就是由 std::hash("過度包裝")
計算出來的值。
清洗完的 edge.csv
檔案:
3413383836870836248,-948987595135324087,含義
3413383836870836248,8037179844375033188,定義
3413383836870836248,-2559124418148243756,標籤
3413383836870836248,8108596883039039864,標籤
2587975790775251569,-4666568475926279810,描述
2587975790775251569,2587975790775251569,中文名稱
2587975790775251569,3771551033890875715,外文名稱
2587975790775251569,2900555761857775043,地理位置
2587975790775251569,-1913521037799946160,佔地面積
2587975790775251569,-1374607753051283066,開放時間
說明:第一列是起點的 VID,第二列是終點的 VID,第三列是這條邊的"屬性"或者"描述"。
在本機完全去重的清洗程式執行時間大約是 6 分鐘。
Step 2. Nebula Graph 啟動準備
下載和安裝
登陸 GitHub 後,在這裡 (連結:https://github.com/vesoft-inc/nebula/actions) 找到 Nebula 的安裝包。
找到你所用系統對應的下載連結:
筆者系統是 CentOS 7.5,下載 CentOS 7.5 最新的壓縮包,解壓後能找到 rpm 安裝包 nebula-5ace754.el7-5.x86_64.rpm
,注意 5ace754
是 git commit 號,使用時可能會有所不同。下載好後解壓,輸入下面命令進行安裝,記得替換成新的 git commit:
$ rpm -ivh nebula-5ace754.el7-5.x86_64.rpm
啟動 Nebula Graph 服務
在 命令列 CLI
輸入下面命令啟動服務
$ /usr/local/nebula/scripts/nebula.service start all
命令執行結果如下:
可以執行以下命令檢查服務是否成功啟動
$ /usr/local/nebula/scripts/nebula.service status all
命令執行結果如下:
連線 Nebula Graph 服務
輸入下面命令連線 Nebula Graph:
$ /usr/local/nebula/bin/nebula -u user -p password
命令執行結果如下:
準備 schema 等後設資料
Nebula Graph 的使用風格有點接近 MySQL,需要先準備各種元資訊。
新建圖空間 space
create space 的概念接近 MySQL 裡面 create database。在 nebula console 裡面輸入下面這個命令。
nebula> CREATE SPACE test;
進入 test space
nebula> USE test;
建立點型別(entity)
nebula> CREATE TAG entity(name string);
建立邊型別 (relation)
nebula> CREATE EDGE relation(name string);
最後簡單確認下後設資料是不是正確。
檢視 entity 標籤的屬性:
nebula> DESCRIBE TAG entity;
結果如下:
檢視 relation 邊型別的屬性:
nebula> DESCRIBE EDGE relation;
結果如下:
Step 3. 使用 nebula-importer 匯入資料
登陸 GitHub 進入 https://github.com/vesoft-inc/nebula-importer ,nebula-importer 這個工具也是 Golang 語言寫的,在這裡下載並編譯原始碼。
另外,準備一個 YAML 配置檔案,告訴這個 importer 工具去哪裡找 csv 檔案。(可直接複製下面這段)
version: v1rc1
description: example
clientSettings:
concurrency: 10 # number of graph clients
channelBufferSize: 128
space: test
connection:
user: user
password: password
address: 127.0.0.1:3699
logPath: ./err/test.log
files:
- path: ./vertex.csv
failDataPath: ./err/vertex.csv
batchSize: 100
type: csv
csv:
withHeader: false
withLabel: false
schema:
type: vertex
vertex:
tags:
- name: entity
props:
- name: name
type: string
- path: ./edge.csv
failDataPath: ./err/edge.csv
batchSize: 100
type: csv
csv:
withHeader: false
withLabel: false
schema:
type: edge
edge:
name: relation
withRanking: false
props:
- name: name
type: string
說明:測試時候發現 csv 資料檔案中有大量轉義字元 (\) 和換行字元 (\r),nebula-importer 也做了處理。
最後:開始匯入資料
go run importer.go --config ./config.yaml
執行過程如下:
可以看到, 本次匯入 QPS 大約在 40 w/s。全部匯入總耗時大約 15 min。
Step 4. 隨便讀點什麼試試
匯入完畢後,我們可以使用 Nebula Graph 服務做一些簡單的查詢。回到 Nebula Graph 的命令列 CLI
:
$ /usr/local/nebula/bin/nebula -u user -p password
進入剛才匯入的三元組資料的 test 空間:
nebula> USE test;
現在,我們可以做一些簡單查詢
- 例 1:與姚明有直接關聯的邊的型別和點的屬性
(user@127.0.0.1) [test]> GO FROM hash("姚明[中國籃球協會主席、中職聯公司董事長]") OVER relation YIELD relation.name AS Name, $$.entity.name AS Value;
執行結果如下:
可以看到:本次查詢返回 51 條資料,耗時 3 ms 左右;
- 例2:查詢姚明和其妻子葉莉在三跳之內的所有路徑
(user@127.0.0.1) [test]> FIND ALL PATH FROM hash("姚明[中國籃球協會主席、中職聯公司董事長]") TO hash("葉莉") OVER relation UPTO 3 STEPS;
執行結果如下:
當資料量較大時,查詢全路徑/最短經之類的操作會比較耗時。可以看到:本次查詢返回 8 條資料,說明姚明和其妻子葉莉在三跳之內共有 8 條直接或間接的關係。
總結
本篇文章涉及到的一些概念和連結:
- OwnThink 的中文知識圖譜資料:https://github.com/ownthink/KnowledgeGraphData。它的資料以三元組形式儲存為 csv
- Nebula Graph 是一個開源的圖資料庫,GitHub 地址:https://github.com/vesoft-inc/nebula,和 Neo4j 相比,它是分散式的
- 資料清洗工具,GitHub 地址:https://github.com/jievince/rdf-converter。因為原始的圖譜 ownthink_v2.csv 資料以三元組形式儲存,並和一般圖資料庫的屬性圖模型略微有些不同,所以寫了一個 Go 語言工具將原始 ownthink_v2.csv 變成 vertex.csv 和 edge.csv
- 資料匯入工具,GitHub 地址:https://github.com/vesoft-inc/nebula-importer。將清洗完的 vertex.csv 和 edge.csv 批量寫入到 Nebula Graph。
後面的工作
- 調整 Nebula 的引數。似乎預設的日誌級別和記憶體都不是很好,可以用下面這個命令關閉日誌,這樣匯入效能可以好很多。
curl "http://127.0.0.1:12000/set_flags?flag=minloglevel&value=4"
- 寫個對應的 Python 版本示例
附錄
Nebula Graph GitHub 地址:https://github.com/vesoft-inc/nebula ,加入 Nebula Graph 交流群,請聯絡 Nebula Graph 官方小助手微訊號:NebulaGraphbot
Nebula Graph:一個開源的分散式圖資料庫。
GitHub:https://github.com/vesoft-inc/nebula
知乎:https://www.zhihu.com/org/nebulagraph/posts
微博:https://weibo.com/nebulagraph
相關文章
- 淺析圖資料庫 Nebula Graph 資料匯入工具——Spark Writer資料庫Spark
- 圖資料庫 Nebula Graph TTL 特性資料庫
- 初識分散式圖資料庫 Nebula Graph 2.0 Query Engine分散式資料庫
- 圖資料庫 Nebula Graph 的安裝部署資料庫
- 為知識的海洋繪製地圖 —— 利用CirroData-Graph圖資料庫構建知識圖譜地圖資料庫
- Dev 日誌 | 文章《快速體驗知識圖譜 OwnThink》中的技術問題dev
- 用 Docker swarm 快速部署分散式圖資料庫 Nebula Graph 叢集DockerSwarm分散式資料庫
- GraphX 在圖資料庫 Nebula Graph 的圖計算實踐資料庫
- 分散式圖資料庫 Nebula Graph 的 Index 實踐分散式資料庫Index
- 圖資料庫|[Nebula Graph v3.1.0 效能報告資料庫
- 圖資料庫|Nebula Graph v3.1.0 效能報告資料庫
- 圖資料庫 Nebula Graph v.1.0.0-beta 已上線資料庫
- 圖資料庫|基於 Nebula Graph 的 BetweennessCentrality 演算法資料庫演算法
- 圖資料庫 Nebula Graph 在 Boss 直聘的應用資料庫
- 圖資料庫 Nebula Graph 的資料模型和系統架構設計資料庫模型架構
- 聊聊圖資料庫和圖資料庫的小知識資料庫
- 基於 Nebula Graph 構建百億關係知識圖譜實踐
- 圖資料庫|基於 Nebula Graph 的 Betweenness Centrality 演算法資料庫演算法
- 【科普】知識圖譜 Neoj4圖形資料庫 Cypher語言資料庫R語言
- 大資料架構師知識圖譜大資料架構
- Jepsen 測試框架在圖資料庫 Nebula Graph 中的實踐框架資料庫
- 圖資料庫對比:Neo4j vs Nebula Graph vs HugeGraph資料庫
- 實驗37--使用neo4j工具匯入知識圖譜
- 聊聊何為圖資料庫和圖資料庫的小知識資料庫
- Nebula Graph|資訊圖譜在攜程酒店的應用
- TiDB、Nebula Graph、ArgoDB、Couchbase等資料庫TiDBGo資料庫
- 圖資料庫實操:用 Nebula Graph 破解成語版 Wordle 謎底資料庫
- 從 Neo4j 匯入 Nebula Graph 實踐見 SPark 資料匯入原理Spark
- Kubernetes 部署 Nebula 圖資料庫叢集資料庫
- 一文讀懂圖資料庫 Nebula Graph 訪問控制實現原理資料庫
- 開源之夏專案分享:圖資料庫 Nebula Graph 支援 JDBC 協議資料庫JDBC協議
- 更強的RAG:向量資料庫和知識圖譜的結合資料庫
- Nebula Importer 資料匯入實踐Import
- [知識圖譜構建] 一.Neo4j圖資料庫安裝初識及藥材供應圖譜例項資料庫
- 【知識圖譜】知識圖譜資料構建的“硬骨頭”,阿里工程師如何拿下?深度學習在知識圖譜構建中的應用。阿里工程師深度學習
- 資料載入、儲存及檔案格式知識圖譜-《利用Python進行資料分析》Python
- 圖資料庫 Nebula Graph 的程式碼變更測試覆蓋率實踐資料庫
- 知識圖譜資料開發是做什麼的