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


摘要:本文簡要介紹知識圖譜的存儲與檢索相關的知識。

本文分享自華為雲社區《知識圖譜的存儲與檢索》,原文作者: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;

參考

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM