本文由 Nebula Graph 實習生@王傑貢獻。git
最近 @Yener 開源了史上最大規模的中文知識圖譜——OwnThink(連接:https://github.com/ownthink/KnowledgeGraphData ),數據量爲 1.4 億條。github
本文介紹如何將這份數據快速導入圖數據庫 Nebula Graph,全過程大約須要 30 分鐘。數據庫
知識圖譜是由 Google 在 2012 年提出來的一個概念。主要是用來描述真實世界中存在的各類實體和概念,以及他們之間的關係。在搜索引擎、問答機器人、知識抽取等多個領域有着諸多應用。微信
最近 Yener 開源了史上最大規模的中文知識圖譜—— OwnThink(連接:https://github.com/ownthink/KnowledgeGraphData),數據量爲 1.4 億條。數據以 (實體, 屬性, 值)
和 (實體, 關係, 實體)
混合的三元組形式存儲,數據格式爲 csv。curl
能夠點擊這裏下載:https://nebula-graph.oss-accelerate.aliyuncs.com/ownthink/kg_v2.tar.gz分佈式
因爲 ownthink_v2.csv 數據過多,摘錄部分數據爲例:工具
紅色食品,描述,紅色食品是指食品爲紅色、橙紅色或棕紅色的食品。 紅色食品,是否含防腐劑,否 紅色食品,主要食用功效,預防感冒,緩解疲勞 紅色食品,用途,加強表皮細胞再生和防止皮膚衰老 大龍湫,描述,雁蕩山景區分散,東起羊角洞,西至鋸板嶺;南起筋竹溪,北至六坪山。 大龍湫,中文名稱,大龍湫 大龍湫,外文名稱,big dragon autrum 大龍湫,門票價格,50元 大龍湫,著名景點,芙蓉峯 姚明[中國籃球協會主席、中職聯公司董事長],妻子,葉莉
這裏的 (紅色食品,是否含防腐劑,否)
就是典型的 (實體, 屬性, 值)
形式的三元組數據; 而 (姚明[中國籃球協會主席、中職聯公司董事長],妻子,葉莉)
是典型的 (實體, 關係, 實體)
形式的三元組數據。post
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 分鐘。
登錄 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
在 命令行 CLI
輸入下面命令啓動服務
$ /usr/local/nebula/scripts/nebula.service start all
命令執行結果以下:
能夠執行如下命令檢查服務是否成功啓動
$ /usr/local/nebula/scripts/nebula.service status all
命令執行結果以下:
輸入下面命令鏈接 Nebula Graph:
$ /usr/local/nebula/bin/nebula -u user -p password
命令執行結果以下:
Nebula Graph 的使用風格有點接近 MySQL,須要先準備各類元信息。
create space 的概念接近 MySQL 裏面 create database。在 nebula console 裏面輸入下面這個命令。
nebula> CREATE SPACE test;
nebula> USE test;
nebula> CREATE TAG entity(name string);
nebula> CREATE EDGE relation(name string);
最後簡單確認下元數據是否是正確。
查看 entity 標籤的屬性:
nebula> DESCRIBE TAG entity;
結果以下:
查看 relation 邊類型的屬性:
nebula> DESCRIBE EDGE relation;
結果以下:
登錄 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。
導入完畢後,咱們可使用 Nebula Graph 服務作一些簡單的查詢。回到 Nebula Graph 的命令行 CLI
:
$ /usr/local/nebula/bin/nebula -u user -p password
進入剛纔導入的三元組數據的 test 空間:
nebula> USE test;
如今,咱們能夠作一些簡單查詢
(user@127.0.0.1) [test]> GO FROM hash("姚明[中國籃球協會主席、中職聯公司董事長]") OVER relation YIELD relation.name AS Name, $$.entity.name AS Value;
執行結果以下:
能夠看到:本次查詢返回 51 條數據,耗時 3 ms 左右;
(user@127.0.0.1) [test]> FIND ALL PATH FROM hash("姚明[中國籃球協會主席、中職聯公司董事長]") TO hash("葉莉") OVER relation UPTO 3 STEPS;
執行結果以下:
當數據量較大時,查找全路徑/最短經之類的操做會比較耗時。能夠看到:本次查詢返回 8 條數據,說明姚明和其妻子葉莉在三跳以內共有 8 條直接或間接的關係。
本篇文章涉及到的一些概念和連接:
curl "http://127.0.0.1:12000/set_flags?flag=minloglevel&value=4"
有問題請微信添加好友 NebulaGraphbot
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