大規模知識圖譜數據存儲實戰解析
1. 什么是知識圖譜
我們的現實世界中有多種類型的事物:
事物之間有多種類型的鏈接:
而知識圖譜即用來描述真實世界中存在的各種實體或概念,以及它們之間的關聯關系。
其中:
- 每個實體或概念用一個全局唯一確定的ID來標識,稱為標識符;
- 每個屬性—值對用來刻畫實體的內在特性,而關系用來連接兩個實體,刻畫它們之間的關聯。
從抽象層面看,本體最抽象,其次是知識庫,***才是知識圖譜,因此本體與知識圖譜的區別在于以下三點:
- 知識圖譜并不是本體的替代品,它是在本體的基礎上進行了豐富和擴充,這種擴充主要體現在實體(Entity)層面;
- 本體中突出和強調的是概念以及概念之間的關聯關系,而知識圖譜則是在本體的基礎上,增加了更加豐富的關于實體的信息;
- 本體描述了知識圖譜的數據模式(schema),即為知識圖譜構建數據模式相當于為其建立本體。
1.1 知識圖譜的應用
知識圖譜已經在人工和商業智能方面有了一系列的應用,包括聊天機器人,臨床決策支持等。
同時為了應對大數據應用的不同挑戰,借助知識圖譜,實現不同的業務需求。
2. 知識圖譜的適用場景
我們看到知識圖譜有了如此多的應用,不過它最適合處理還是這些數據:
關系復雜的數據;
類型繁多的數據;
結構多變的數據。
作為數據融合與鏈接的紐帶,知識圖譜整合結構化、半結構化和非結構化數據,擁有如下的消費和數據場景
但知識圖譜不是銀彈!需要我們依據不同的問題尋找合適的方法,不要為了用知識圖譜而用知識圖譜。
知識圖譜的不適用場景如下:
不適用的數據場景:
- 通常的二進制數據
- 日志數據
- 流式數據
不適用的消費場景:
- 數據統計
- 數據計算
這些不適用場景都需要借助其它工具存儲和處理,同時結合其它工具和方法使用,最終與知識圖譜進行數據鏈接。
3. 知識圖譜的存儲
通過上面的內容,我們了解到知識圖譜最適合處理關聯密集型的數據,因此首先需要存放的是圖譜中的節點和邊的數據;知識圖譜基于圖數據庫的優點,能夠方便的存放這一類關系型的數據,對于大量其他類型的數據我們如何處理呢?
由此可知知識圖譜數據的存儲不等于圖數據庫。
接下來本文重點介紹知識圖譜數據存儲的幾種常見方式。
3.1 知識圖譜數據存儲的幾種常見方式
知識圖譜的存儲并不依賴特定的底層結構,一般的做法是按數據和應用的需求采用不同的底層存儲。你甚至可以基于現有關系數據庫或NoSQL數據庫進行構建。我們來列舉一下幾種常見做法:
三元組表(S,P,O)
類似RDF存儲結構(下文會進行介紹),以元組為單元進行存儲。語義較為明確。
問題:大量自連接操作的開銷巨大。
屬性表:屬性相似的主語聚為一張表
類似關系型數據結構,每一條數據代表一個實體,每一列代表一個屬性。
問題:1.RDF靈活性(高于一階的關系查詢很復雜);2.查詢時必須指定屬性,無法做不確定屬性的查詢。
垂直分割:以謂語劃分三元組表
根據屬性的不同建立數據表,數據結構較為清晰。
問題:1.大量數據表;2.刪除屬性代價大。
以上這些方案都會有各自的優缺點,在實現時需要根據不同的應用場景來進行選擇,并設計索引、約束等方法來解決查詢效率問題。
目前圖結構存儲有兩種通用的存儲方案:RDF存儲和圖數據庫(Graph Database)。下圖為兩種存儲在http://db-engines.com/上的發展趨勢:
可以明顯地看到基于圖的存儲方式在整個數據庫存儲領域的發展飛速。
3.1.1 RDF存儲
RDF存儲亦稱三元組存儲(triplestore),它是專為存儲三元組形式的數據而設計的專用數據庫,通過六重索引(SPO、SOP、PSO、POS、OSP、OPS)的方式解決了三元組搜索的效率問題。
其優點是:
三元組模式查詢(triple pattern)的高效執行;
任意兩個三元組模式的高效歸并連接(merge-join)。
但缺點也很明顯:
六重索引意味著6倍空間開銷,如果是 (S, P, O, C) 四元組呢?
更新維護代價大。
現在越來越多的RDF數據庫通過列式存儲的方式來對三元組進行存儲,進一步提高六重索引下的查詢效率。
3.1.2 圖數據庫
圖數據庫的結構定義相比RDF數據庫更為通用,實現了圖結構中的節點,邊以及屬性來進行圖數據的存儲,典型的開源圖數據庫就是Neo4j。
這種做法的優點是數據庫本身提供完善的圖查詢語言、支持各種圖挖掘算法,但圖數據庫的分布式存儲實現代價高,數據更新速度慢,大節點的處理開銷很高。
3.2 大規模知識圖譜存儲***解決方案
指導思想仍舊是之前提到的“數據思維”和“No Size Fits All”,整體原則歸結為以下六點:
(1)基礎存儲
可按數據場景選擇使用關系數據庫、NoSQL數據庫及內存數據庫;
基礎存儲保證可擴展、高可用。
(2)數據分割
屬性表:依據數據類型劃分
基本類型:整數表、浮點數表、日期類型表、…
集合類型:List型表、Range型表、Map型表、…
大屬性單獨列表:例如數量超過10M的屬性單獨列表。
(3)緩存與索引
使用分布式 Redis 作為緩存,按需對數據進行緩存;
對三元組表按需進行索引,最多情況下可建立九重索。
(4)善于使用現有成熟存儲
使用ElasticSearch實現數據的全文檢索;
結構固定型的數據可使用關系數據庫或NoSQL。
(5)對于非關系型的數據盡量不入圖存儲,避免形成大節點
非關系型的數據,使用適合的數據存儲機器進行存儲,通過實體鏈接的方式實現與圖譜數據的關聯。
(6)不直接在圖存儲中進行統計分析計算
對于需要進行統計分析計算的數據,需要導出到合適的存儲中進行。
4. 知識圖譜時態信息及存儲
眾所周知,信息是有時態的,時態特性是信息的客觀存在,同時知識和數據是不斷更新的,這些變化的時間點同樣代表了有意義的信息。
時態信息的需求與技術一直伴隨著數據庫技術的發展而產生和發展。下圖為時態數據庫與其他類型數據庫相比的發展趨勢:
可以發現時態數據庫的發展趨勢遠遠高于與其他數據存儲方式。
知識圖譜中的時態信息包含以下四個方面:
- 事實的生成時間;
- 某事實的有效時間段;
- 某一對象在特定歷史時刻的狀態;
- 知識圖譜在過去特定時間的版本。
下面的視頻為利用PlantData知識圖譜數據智能平臺,查詢出的北京小桔科技有限公司(嘀嘀打車)擁有時態信息的企業創投知識圖譜。
結合最近很火的一部電視劇《人民的名義》我們來理解一下知識圖譜中的時態信息。
知識圖譜時態信息存儲實現的設計原則如下:
5. 使用圖數據庫進行數據存儲
在選擇圖數據存儲的指標上,需要考慮以下幾個方面:
數據存儲支持;
數據操作和管理方式;
支持的圖結構;
實體和關系表示;
查詢機制。
此處選擇圖數據庫進行知識圖譜數據的存儲:
- 應用場景:創投知識圖譜;
- 數據維度:創投知識圖譜描述創業企業與投資機構之間以投資為主線的多種關系,包含:企業產品、創始人、股東、高管、行業、細分行業、新聞、投融資事件、關注度、活躍度、招聘等方面;
- 應用目標:基于創投知識圖譜及平臺分析功能,投資機構能夠完成創業企業、行業調研及追蹤,為投資進行輔助決策;創業企業也可以分析熱點投資賽道、關注行業動態及競爭對手動向。
初創企業相關的數據包括:
- 工商注冊信息
- 企業產品
- 創始人/股東/高管
- 所屬行業/領域
- 投融資事件
- 專利/招聘/訴訟/失信
- 新聞/社交網絡數據
- 產品活躍數據
關系型數據(通過關系形成網絡):
企業與創始人
企業與投資人(機構)
企業與產品
企業與高管
高管與高校
關系型數據的存儲方法:作為實體存入知識圖譜,通過它們之間的關系形成圖譜網絡。
結構型數據(與主體進行關聯,但不會再續延伸):
企業與專利/招聘/訴訟/失信
企業與新聞
企業與投融資事件
企業產品活躍數據
結構型數據的存儲方法:作為記錄型數據存入合適的存儲中,通過鏈接與圖譜中的實體進行關聯。
屬性型數據:
企業的工商注冊中基本信息
企業的所屬行業
創始人的基本信息
產品的基本信息
投資機構基本信息
高?;拘畔?/p>
屬性型數據的存儲方法:作為實體的數值屬性存入知識圖譜。
時態型數據:
企業的成立時間
高管的任職時間
投資關系的發生時間
產品的發布時間
時態型數據的存儲方法:使用基于知識圖譜上的時間存儲中間件進行存儲和查詢處理。
Schema定義:概念選取
企業
創業企業
投資機構
人物
投資個人
高管
股東
產品
Schema定義:關系和屬性的定義
關系的定義
企業與創始人的關系
企業與投資人(機構)的投資關系
企業與產品的所屬關系
企業與高管的任職關系
高管與高校的教育背景關系
屬性的定義
企業的屬性
人物的屬性
產品的屬性
使用圖數據庫進行數據存儲一般過程:
導入實體,概念(Label)
導入實體屬性
導入實體間關系
***實踐過程:
分批導入,并使用Index提升導入時查詢效率
按數據的類型、屬性不同準備導入文件
數據主鍵維護,使用Constraints
盡可能保證導入數據格式正確
總結一下,復雜應用場景下知識圖譜數據存儲的原則:
- 關系型數據:使用圖形數據存儲;
- 關聯型數據:作為記錄型數據存入合適的存儲中,通過實體鏈接與圖譜中實體關聯;
- 屬性型數據:作為實體的數值屬性存入知識圖譜;
- 時態型數據:使用基礎存儲上的時態處理中間件進行存儲與查詢。