如何高效地儲存與檢索大規模的圖譜資料?

solution發表於2021-09-11
摘要:本文簡要介紹知識圖譜的儲存與檢索相關的知識。

本文分享自華為雲社群《》,原文作者:JuTzungKuei 。

1、概述

背景:隨著網際網路的發展與普及,一個萬物互聯的世界正在成型。與此同時,資料呈現出爆炸式的指數級增長,我們正處於一個數字洪流洶湧澎湃的新時代。

如何高效地儲存與檢索大規模的圖譜資料?

我們每天產生多少資料?據統計每天:

    • 傳送5億條推文部落格;
    • 傳送2940億封郵件;
    • 全世界每天有50億次線上搜尋;
    • 一輛聯網汽車會產生4TB的資料;
    • Facebook每天產生4PB的資料,其中包含3.5億的照片以及1億小時的影片。

知識越來越多,目前常見的知識圖譜都是以三元組的資料形式構成。

    • DBpedia 有近8千萬條三元組;
    • YAGO 有超過1.2億三元組;
    • Wikidata 有近4.1億三元組;
    • Freebase有超過30億三元組;
    • 中文百科有約1.4億三元組。

如何高效地儲存與檢索大規模的圖譜資料?

所以,我們該如何高效地儲存與檢索大規模的圖譜資料???

知識圖譜是一個有向圖結構,描述了現實世界中存在的實體、事件或者概念以及它們之間的關係。其中,有向圖中的節點表示實體、事件或者概念,圖中的邊表示相鄰節點之間的關係。

如何高效地儲存與檢索大規模的圖譜資料?

圖中展示了關於劉德華的知識圖譜區域性示意圖。圖中紅色字型表示概念,矩形框表示實體,藍色字型表示屬性,橢圓表示屬性值,橙色字型表示關係。

  • 概念:人物、國家、電影等
  • 實體:劉德華、朱麗倩、中國、天下無賊等
  • 屬性:身高、體重、性別、首都、簡稱、上映時間、豆瓣評分等
  • 關係:妻子、女兒、國籍、主演等

2、知識圖譜的儲存

知識圖譜中的知識是透過RDF結構進行表示的,其基本構成單元是事實。

  • 每個事實是一個三元組:<主語S, 謂語P, 賓語O>,其中:
    • 主語S:可以是實體、事件、概念
    • 謂語P:可以是關係、屬性
    • 賓語O:可以是實體、事件、概念、普通值

下面展示了知識圖譜中知識表示的三元組列表。
<S, P, O>
<劉德華, 生日, 1961年9月27日>
<劉德華, 血型, AB型>
<劉德華, 妻子, 朱麗倩>
<劉德華, 女兒, 劉向蕙>
<劉德華, 國籍, 中國>
<中國, 首都, 北京>
。。。 。。。

為了對知識圖譜資料進行高效查詢和管理,需要在儲存介質上合理地組織這些資料。按照儲存方式的不同,標準知識儲存方法可以分為基於表結構的儲存和基於圖結構的儲存。

2.1、基於表結構的儲存

基於表結構的儲存利用二維的資料表對知識圖譜中的資料進行儲存。根據不同的設計原則,知識圖譜可以具有不同的表結構,目前可以分為五類:三元組表、屬性表、水平表、垂直表和全索引。

2.1.1 三元組表

知識圖譜中的事實是一個個的三元組,一種簡單直接地儲存方式是設計一張表用於儲存知識圖譜中所有的事實,就是在關聯式資料庫中建一張具有三列的表,該表的模式為:<主語,謂語,賓語>。將知識圖譜中的每條三元組儲存為三元組表中的一行記錄。

這種儲存方式簡答直接,易於理解,但是將整個知識圖譜都儲存在一張表中,會導致單表的規模太大,在複雜查詢,或者增刪改查時會有非常大的開銷。

方案代表:RDF資料庫系統 3store、Virtuoso

如何高效地儲存與檢索大規模的圖譜資料?

2.1.2 屬性表

屬性表,又稱型別表,即為每種型別構建一張表,同一型別的例項放在相同的表中。表的每一列表示該類實體的一個屬性,每一行儲存該類實體的一個例項。

這種儲存方式雖然客服了三元組表的不足,但是也造成了新的問題,大量資料欄位重複,部分資料的屬性值存在空值,均會造成冗餘儲存。

方案代表:RDF三元組庫 Jena

人物

如何高效地儲存與檢索大規模的圖譜資料?

國家

如何高效地儲存與檢索大規模的圖譜資料?

電影

如何高效地儲存與檢索大規模的圖譜資料?

2.1.3 水平表

水平表每行記錄儲存一個知識圖譜中一個主語的所有謂語和賓語。實際上,水平表相當於知識圖譜的鄰接表。水平表的列數是知識圖譜中不同謂語的數量,行數是知識圖譜中不同主語的數量。

真實知識圖譜中,不同謂語數量可能成千上萬個,會超出資料庫上限;存在大量空值。

方案代表:早期的RDF資料庫系統 DLDB

如何高效地儲存與檢索大規模的圖譜資料?

2.1.4 垂直表

垂直表是一種以三元組的謂語作為劃分維度的方法,將RDF知識圖譜按照謂語劃分為若干張只包含主語和賓語兩列的表,表的總數量即知識圖譜中不同謂語的數量,也就是說,為每種謂語建立一張表,表中存放知識圖譜中由該謂語連線的主語和賓語值。

這種方法用不同表之間的連線代替自連線,避免了自連線操作。但是它無法很好地支援謂語是變數的查詢操作。

方案代表:SW-Store

性別

如何高效地儲存與檢索大規模的圖譜資料?

主演

如何高效地儲存與檢索大規模的圖譜資料?

首都

如何高效地儲存與檢索大規模的圖譜資料?

2.1.5 全索引

全索引,又稱六重索引,是針對知識圖譜資料和運算的特點提出的一種最佳化技術,利用知識圖譜三元組的特點來構建索引。將三元組中主語、謂語、賓語的各種排列情況都列舉出來,然後為它們一一構建索引。主語、謂語和賓語的排列情況共計六種。這些索引內容正好對應知識圖譜運算中帶變數的三元組模式的各種可能,是一種典型的“空間換時間”策略。

這種方法不僅緩解了三元組表的單表自連線問題,而且加速了圖譜的查詢效率。但是也增加了更新和維護成本。

方案代表:RDF-3X、Hexastore

六張表:SPO、SOP、PSO、POS、OSP、OPS

2.2、基於圖結構的儲存

基於圖結構的儲存是利用圖的方式對知識圖譜中的資料進行儲存。將實體看作節點,關係看作帶有標籤的邊,那麼知識圖譜的資料很自然地滿足圖模型的結構。基於圖結構的儲存方式能夠直接準確地反映知識圖譜的內部結構,目前主要有兩種圖儲存模式:鄰接表和鄰接矩陣。對應的資料庫是圖資料庫,資料模型是屬性圖。

2.2.1、鄰接表

所謂的鄰接表,就是知識圖譜中的每個節點(實體)對應一個列表,列表中儲存與該實體相關的資訊。在利用圖結構管理知識圖譜資料的時候,一個關鍵問題是如何在基於圖結構的指數候選空間中對查詢操作有效剪枝。

如何高效地儲存與檢索大規模的圖譜資料?

2.2.2、鄰接矩陣

所謂的鄰接矩陣,就是在計算機中維護多個n x n維的矩陣,其中n為知識圖譜中節點的數量。每個矩陣對應一個謂語,其中每一行或每一列都對應知識圖譜中的一個節點。若謂語p所對應的矩陣中第i行第j列為1,則表示知識圖譜中第i個節點到第j個節點有一條謂語為p的邊。

三維矩陣M:|S| x |P| x |O|,分別表示主謂賓的數量,如果 <s, p, o>存在於知識圖譜中,則M[i][j][k]=1,否則設定為0。

2.2.3、圖資料庫

圖資料庫的理論基礎是圖論,透過節點、邊和屬性對資料進行表示和儲存。具體來說,圖資料庫基於有向圖,其中節點、邊、屬性是圖資料庫的核心概念。

  • 節點:表示實體、事件等物件。
  • 邊:指圖中連線節點的有向線條,用於表示不同節點之間的關係。
  • 屬性:描述節點或邊的特性。
  • 常見圖資料庫:Neo4J、JanusGraph、OrientDB等;

如何高效地儲存與檢索大規模的圖譜資料?

3、知識圖譜的檢索

知識圖譜的知識實際上是透過資料庫系統進行儲存的,大部分資料庫系統透過形式化的查詢語言為使用者提供訪問資料的介面。

3.1 SQL

Structured Query Language 結構化查詢語言,用於管理關係型資料庫。

四種操作

    • 增:insert into 表名(列1, 列2, ...) values(值1, 值2, ...)
    • 刪:delete from 表名 where 條件
    • 改:update 表名 set 列1=值1 where 條件
    • 查:select 列1, 列2, ... from 表名 where 條件

3.2 SPARQL

SPARQL是由W3C為RDF資料開發的一種查詢語言和資料獲取協議,是被圖資料庫廣泛支援的查詢語言。

三種操作:

    • 增:insert data 三元組資料
    • 刪:delete data 三元組資料
    • 改:無,增刪結合
    • 查:select 變數1, 變數2, ... where 圖模式
select ?x, ?y
where {
    天下無賊 主演 ?x .
    無間道 主演 ?x .
    ?x 生日 ?y .
}

3.3 Gremlim

Gremlin是Apache Tinkerpop框架中使用的圖遍歷語言,使用Gremlin可以很方便的對圖資料進行查詢,進行圖的修改、區域性遍歷和屬性過濾等。

三種操作

    • 增:g.addV('人物').property(id,'007').property('生日','1962年6月22日')、g.addE('丈夫').property('xxx', 'yyy').from(g.V('001')).to(g.V('002'))
    • 刪:g.V('007').drop()
    • 查:g.V().hasLabel('人物')、g.E().label()、g.V().valueMap()

3.4 Cypher

Cypher是一個描述性的圖形查詢語言,允許不必編寫圖形結構的遍歷程式碼對圖形儲存有表現力和效率的查詢。是一種被廣泛使用的宣告式圖資料庫查詢語言。

四種操作

    • 增:create(n:人物 {name: '周星馳', 生日: '1962年6月22日'}) return n;
    • 刪:match(s:Student{id: 1}) detach delete s;
    • 改:match(n) where id(n)=7 set n.name = 'neo' return n;
    • 查:match(n{name:"劉德華"}) return n、match(a:人物 {name:"劉德華"})-[b:Relation {{name:"國籍"}]->(c) return c;

參考

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2796059/,如需轉載,請註明出處,否則將追究法律責任。

相關文章