背景
知識圖譜是一種有向圖結構,描述了現實世界存在的實體、事件或者概念以及它們之間的關係,爲自動問答、信息檢索等應用提供支撐。其中,圖中的節點表示實體、事件或概念,圖中的邊表示相鄰節點間的關係,如下圖所示。
- 每一個節點表示一個實體,每個實體都是某一抽象概念的實例。這些抽象概念被稱爲實體類型,如:人物、城市等。
- 實體除了具有類型信息,還具有豐富的屬性信息(藍色部分),這些屬性信息用於刻畫實體的內在特性。
- 實體除了具有類型信息,還具有豐富的屬性信息(藍色部分),這些屬性信息用於刻畫實體的內在特性。
一、知識圖譜的存儲
知識圖譜中的知識是通過RDF進行表示的,其基本構成單元是事實。每個事實是一個三元組 (S, P, O)
- S 是主語(Subject),其取值可以是實體、事件或概念中的任何一個;
- P 是謂語(Predicate),其取值可以是關係或屬性;
- O 是賓語(Object),其取值可以是實體、事件、概念或普通的值(eg:數字、字符串等)
知識表示的三元組列表 示例如下:
RDF數據
<S, P, O>
<費米, 主要成就, 93號元素>
<費米, 出生日期, 1901/09/29>
<費米, 類型, 物理學家>
<費米, 國籍, 美國>
<費米, 出生地, 羅馬>
<費米, 老師, 玻爾>
<玻恩, 主要成就, 玻恩近似>
<玻恩, 類型, 物理學家>
<玻恩, 類型, 數學家>
... ... ...
按照存儲方式的不同,可分爲:基於表結構的存儲 和 基於圖結構的存儲
1、基於表結構的存儲
利用二維數據表對知識圖譜中的數據進行存儲,常見的設計方法有:三元組表、類型表、關係數據庫等
(1)三元組表
成熟產品:Jena、Oracle、Sesame、3store、SOR、Rstar 和 Virtuoso。
優點:簡單直接、易於理解;
缺點:
- 整個知識圖譜都存儲在一張表中,導致單表的規模太大。對大表進行查詢、插入、刪除、修改等操作的開銷很大,這將導致KG的實用性大打折扣。
- 複雜查詢在這種存儲結構上的開銷巨大。由於數據表只包括三個字段,因此複雜的查詢只能拆分稱若干簡單查詢的符合操作,大大降低查詢的效率。
(2)類型表
爲每種類型構建一張表,同一類型的實例存放在相同的表中。表中的每一列表示該類實體的一個屬性,每一行存儲該類實體的一個實例。
示例:
- 城市表
主體對象 | 面積 | 平均海拔 | 郵編 |
---|---|---|---|
羅馬 | 1285 | 37m | 00185 |
- 人物表
主體對象 | 主要成就 | 國籍 | 出生日期 | 出生地 |
---|---|---|---|---|
費米 | 93號元素 | 美國 | 1901/09/29 | 羅馬 |
奧本海默 | 曼哈頓計劃 | 美國 | 1904/04/22 | |
玻恩 | 玻恩近似 | 英國 | 1882/12/11 |
- 物理學家表
主體對象 | 主要成就 | 國籍 | 出生日期 |
---|---|---|---|
費米 | 93號元素 | 美國 | 1901/09/29 |
奧本海默 | 曼哈頓計劃 | 美國 | 1904/04/22 |
玻恩 | 玻恩近似 | 英國 | 1882/12/11 |
- 數學家表
主體對象 | 主要成就 | 國籍 | 出生日期 |
---|---|---|---|
費米 | 93號元素 | 美國 | 1901/09/29 |
缺點:(然後克服三元組表的不足)
- 大量數據字段的冗餘存儲。假設知識圖譜中既有“數學家”又有“物理學家”,則同屬於這兩個類別的實例將會同時被存儲在這兩個表中,其中它們共有的屬性會被重複存儲。如上面的表 3 與表 4
- 大量的數據列爲空值。通常知識圖譜中並非每個實體在所有屬性或關係上都有值。
解決方法:將知識圖譜的類別體系考慮進來。
- 具體來說,每個類型的數據表都只記錄屬於該類型的特有屬性,不同類別的公共屬性保存在上一級類型對應的數據表中,下級表繼承上級表的所有屬性。下圖爲考慮層級關係的類型表,(a)爲人物相關的類別體系,(b)爲該類別體系下設計的類型表。
缺點 - 由於類型表的不同字段表示不同的屬性或關係,因此查詢時必須指明屬性或關係,無法做不確定屬性或關係的查詢。
- 由於數據表是和具體類型對應的,不同類型的數據表具有不同的結構,因此在查詢之前必須知道目標對象的類型才能確定查找的數據表。則需要維護一個“屬性-類型”映射表,以便在進行屬性查詢時可以根據目標屬性確定類型。
- 當查詢涉及不同類型的實體時,需要進行多表的鏈接,該操作開銷巨大,限制KG對複雜查詢的處理能力。
- KG包含豐富的實體類型,因此需要創建大量的數據表,並且這些數據表之間又具有複雜的關係,增加管理難度。
(3)關係數據庫
關係數據庫通過 屬性 對現實世界中的事物進行描述。
- 每個屬性的取值範圍所構成的集合,稱爲對應屬性的 域
- 屬性的取值只能是原子數據。
- 原子數據:不能進步拆分的數據,eg:整數、字符串等
- 非原子數據:由多個原子數據構成,可進步拆分,eg:集合、列表、元組等。
- 關係數據庫以二維表對數據進行組織和存儲,表的每一列表示一個屬性,每一行表示一條記錄。
屬性按照各自特點可分爲:
- 候選鍵:能夠唯一標識一條記錄的最少的屬性集合。
- 唯一性:候選鍵在整個表的範圍內必須具有唯一的值,不同記錄不能具有相同的候選鍵值;
- 最小性:候選鍵所包含的屬性必須是必不可少的,缺少其中的任何一個都不再具備唯一性。
- eg:學生的學號、身份證號分爲都可以作爲候選鍵,但是(學號,身份證號)這屬性組不滿足最小性,不能作爲候選鍵。
- 主鍵:一個數據庫包含多個候候選鍵,從中任意選取一個爲主鍵。一般選擇單屬性組成的候選鍵作爲主鍵。
- 外鍵:數據表中的某個屬性或屬性組是其他表的候選鍵,則稱爲當前表的外鍵。外鍵可以保證不同數據表之間數據的一致性。
- 主屬性與非主屬性:包含在任何候選鍵中的屬性爲主屬性,不包含在任何候選鍵中的屬性爲非主屬性。
常見可用於KG的關係數據庫:DB2、Oracle、Microsoft SQL Sever、PostgreSQL、MySQL等
2、基於圖結構的存儲
基於圖結構的存儲,可直接準確地反映KG的內部結構,有利用對知識的查詢,可借鑑圖論算法,有利於對知識深度挖掘及推理。
(1)基於圖結構的存儲模型
- 節點:表示實體,可以定義屬性(用於描述實體特性)。
- 邊:表示實體之間的關係,可以定義邊的屬性。
基於圖結構的存儲,從實體出發,不同實體對應的節點可定義不同的屬
(2)常用圖數據庫介紹
圖數據庫的理論基礎是圖論,通過節點、邊 和 屬性對數據進行表示和存儲,具體來說,圖數據庫基於有向圖,其中節點、邊、屬性是圖數據庫的核心概念。
- 節點:表示實體、事件等對象。eg:人物、地點、電影等都可作爲圖中的節點。
- 邊:指圖中連接節點的有向線條,表示節點之間的關係。eg:人物節點之間的夫妻關係、同事關係等。
- 屬性:描述節點或邊的特性。eg:人物(節點)的姓名、夫妻關係(邊)的起止時間等。
常見圖數據庫:Neo4j、OrientDB、InfoGrid、HyperGraphDB、InfiniteGraph(分佈式)等
- Neo4j:開源、高性能、本地數據庫(訪問速度快)、輕量級;
- OrientDB:開源文檔-圖數據庫、多模式、本地數據庫;
- …
二、知識圖譜的檢索
1、常見形式化查詢語言
KG是通過數據庫進行存儲的,大部分數據庫系統通過形式化的查詢語言爲用戶提供訪問數據的接口,關係型數據庫的標準查詢語言是SQL,圖數據庫的標準查詢語言是SPARQL。
(1)SQL(Structured Query Language,結構化查詢語言)
主要功能:對數據的插入、修改、刪除、查詢四種操作。
示例:Triples表
S | P | O |
---|---|---|
費米 | 類型 | 物理學家 |
費米 | 出生日期 | 1902/09/29 |
費米 | 搭檔 | 奧本海默 |
奧本海默 | 搭檔 | 費米 |
奧本海默 | 出生日期 | 1904/04/22 |
奧本海默 | 畢業院校 | 阿根廷大學 |
費米 | 出生地 | 羅馬 |
羅馬 | 海拔 | 37m |
- 數據插入——INSERT
INSERT INTO 表名 VALUES (值1,值2,...) [,值1,值2,...], ...
:值1,值2…分別對應數據表中第一列、第二列,VALUES對應的值的順序和數量有嚴格的要求。INSERT INTO 表名 (列1,列2,...) VALUES (值1,值2,...) [,值1,值2,...], ...
:指明插入數據的列- eg:新增“玻恩”實體及其屬性,以及與“費米”的關係
(S:費米,P:老師,O:玻恩)
INSERT INTO Triples VALUES ('費米','老師','玻恩'),('玻恩','類型','數學家'),('玻恩','類型','物理學家')
INSERT INTO Triples (S,P,O) VALUES ('費米','老師','玻恩'),('玻恩','類型','數學家'),('玻恩','類型','物理學家')
- 數據修改——UPDATE
UPDATE 表名 SET 列1=值1,列2=值2,... WHERE 條件
其中’條件’指明需修改的數據記錄,若不指定,則整個表的數據都被修改。- eg:“費米”的出生日期修改爲"1901/09/29"
UPDATE Triples SET O='1901/09/29' WHERE S='費米' and P='出生日期'
- 數據刪除——DELETE
DELETE FROM 表名 WHERE 條件
其中’條件’指明需修改的數據記錄,若不指定,則整個表的數據都被修改。- eg:刪除“奧本海默”實體和與其相關的所有邊
DELETE FROM Triples WHERE S='奧本海默' or O='奧本海默'
- 數據查詢——SELECT
SELECT 列1, 列2, ... FROM 表名 WHERE 條件
、SELECT * FROM 表名 WHERE 條件
- eg:查詢所有數學家實體
SELECT S FROM Triples WHERE P='類型' and O='數學家'
- 此外,SQL還內置函數(最大值、最小值、平均值等)、表連接(JOIN)等
(2)SPARQL語言
SPARQL是由W3C爲RDF數據開發的一種查詢語言和數據獲取協議,被廣泛應用於圖數據庫。
a、數據插入——INSERT DATA
- 基本語法:
INSERT DATA 三元組數據
,其中三元組數據可以是多條三元組,不同的三元組通過 ‘.’ 分割,用 ‘;’ 可以分割連續插入語前一個三元組的頭實體相同的三元組。若待插入的三元組在RDF中已存在,則忽略該三元組。 - eg:向上圖表示的RDF中插入以下三元組:
ns:費米 ns:老師 ns:玻恩.
ns:玻恩 ns:類型 ns:數學家.
ns:玻恩 ns:類型 ns:物理學家.
==》對應的 SPARQL 語句
prefix ns: <http://example.org/ns#>
INSERT DATA {
ns:費米 ns:老師 ns:玻恩 .
ns:玻恩 ns:類型 ns:數學家 ;
ns:類型 ns:物理學家 .
}
結果如下所示:
b、數據刪除——DELETE DATA
- 基本語法:
DELETE DATA 三元組數據
,其中三元組數據可以是多個三元組。對於給定的每個三元組,若其在RDF圖中,則刪除,否則忽略該三元組。 - eg:向上圖表示的RDF中刪除三元組
(ns:奧本海默 ns:類型 ns:物理學家)
,注意刪除單個三元組
prefix ns: <http://example.org/ns#>
DELETE DATA {
ns:奧本海默 ns:類型 ns:物理學家 .
}
結果如下所示:刪除單個三元組
- 刪除節點,eg:刪除“奧本海默”節點
prefix ns: <http://example.org/ns#>
DELETE WHERE {
ns:奧本海默 ?p ?o .
?s ?p ns:奧本海默 .
}
結果如下所示:刪除節點
c、數據更新
數據更新是指更新RDF圖中三元組的值,SPARQL通過組合 INSERT DATA 語句和 DELETE DATA 語句來實現數據更新的功能。
eg:修改三元組(ns:費米 ns:出生日期 "1902/09/29")
修改爲(ns:費米 ns:出生日期 "1901/09/29")
prefix ns: <http://example.org/ns#>
DELETE DATA {ns:費米 ns:出生日期 "1902/09/29" .};
INSERT DATA {ns:費米 ns:出生日期 "1901/09/29" .}
結果如下:
d、數據查詢
四種形式:SELECT、ASK、DESCRIBE 和 CONSTRUCT。
- SELECT:從KG中獲取滿足條件的數據;
- ASK:用於測試KG中是hi否存在滿足給定條件的數據,若存在則返回“YES”,否則爲“NO”,該查詢不返回具體的匹配數據;
- DESCRIBE:用於查詢和制定資源相關的RDF數據,這些數據形成了對給定資源的詳細描述;
- CONSTRUCT:根據查詢圖的結果生成RDF。
SELECT:從KG中獲取滿足條件的數據;
- 基於語法:
SELECT 變量1 變量2 ... WHERE 圖模式 [修飾符]
- SELECT子句
SELECT 變量1 變量2 ...
:表示要查詢的目標。 - WHERE子句
WHERE 圖模式
:爲SELECT子句中的變量提供約束,查詢結果必須完全匹配該子句給出的圖模式。- 圖模式:主要包含兩類元素,一類是三元組。eg:
?x a Person
表示變量?x必須是Person的一個實例。另一類是通過FILTER關鍵字給出的條件限制,包括數字大小的限制、字符串格式的限制等。
- 圖模式:主要包含兩類元素,一類是三元組。eg:
- 可選項
[修飾符]
:用於對查詢結果做一些特殊處理,例如:ORDER子句、LIMIT子句(限制結果數量)等。
- SELECT子句
- 示例:查詢類型既是“數學家”也是“物理學家”的節點
prefix ns: <http://example.org/ns#>
SELECT ?s
WHERE {
?s ns:類型 ns:數學家 .
?s ns:類型 ns:物理學家 .
}
查詢結果
S |
---|
玻恩 |
ASK:用於測試KG中是hi否存在滿足給定條件的數據
- 基本語法:
ASK 圖模式
,其中圖模式與 SELECT 相同。 - 示例:測試是否存在“費米”老師的節點,對應的語句爲:
prefix ns: <http://example.org/ns#>
ASK { ns:費米 ns:老師 ?o .}
該語句返回的結果是“yes”,若數據中不存在“費米”的老師節點(即“玻恩”)則返回“no”
DESCRIBE:用於獲取與給定資源相關的數據
- 基本語法:
DESCRIBE 資源或變量 [WHERE 圖模式]
- DESCRIBE後既可直接跟確定的資源標識符,也可跟變量;
- WHERE 子句爲可選項,用於限定變量滿足的圖模式。
- 示例:獲取老師爲“玻恩”的節點的所有信息,對應的語句如下:
prefix ns: <http://example.org/ns#>
DESCRIBE ?s WHERE {?s ns:老師 ns:玻恩 .}
執行結果如下:
@prefix ns:<http://example.org/ns#>
ns:費米 ns:類型 ns:物理學家
ns:費米 ns:出生日期 "1901/09/29"
ns:費米 ns:老師 ns:玻恩
CONSTRUCT:用於生成滿足圖模式的RDF圖
- 基本語法:
CONSTRUCT 圖模板 WHERE 圖模式
- 圖模板:確定生成的RDF圖所包含的三元組類型,它由一組三元組構成,每個三元組既可以是包含變量的三元組模板,也可以是不包含變量的事實三元組;
- 圖模式,用於約束語句中的變量
- 基本流程:首先執行WHERE子句,從KG中獲取所有滿足圖模式的變量取值;然後針對每一個變量取值,替換RDF圖模板中的變量,生成一組三元組。
- 示例:
prefix ns: <http://example.org/ns#>
CONSTRUCT {
?s ns:搭檔 ns:奧本海默 .
ns:奧本海默 ns:搭檔 ?s .
}
WHERE {
?s ns:老師 ns:玻恩 .
}
執行結果爲:
@prefix ns:<http://example.org/ns#>
ns:費米 ns:搭檔 ns:奧本海默 .
ns:奧本海默 ns:搭檔 ns:費米 .
2、圖檢索技術
問題的提出:基於圖結構的存儲方式能夠直觀靈活地對知識進行表示和存儲,而標準的圖查詢算法複雜度較高,何如提高圖查詢的效率成爲KG研究的重要問題。
定義(即子圖匹配問題):NP完全問題(目前尚不存在多項式時間複雜度內可解決的算法)
- 在給定查詢圖 和目標圖集 的條件下,在 中找出所有與 同構的子圖。
- (數學上定義):圖 和圖 的子圖同構,當且僅當存在一個雙射函數 ,對於 的任意一條邊 ,都有 。
- 與數學中的區別(優勢):
- 不會觸發子圖匹配算法的最壞情況。KG中的圖結構通常不會特別複雜,只有少數節點之間有邊相連。
- 利用KG中豐富的標籤信息可以有效降低算法的搜索空間。
(1)子圖篩選
圖索引技術是實現子圖篩選的有效方法。在數據預處理階段進行。
基本原理:首先根據圖上的特徵信息建立索引,在進行子圖匹配時,根據查詢圖上的特徵能夠快速地從圖數據庫中檢索得到滿足條件的候選子圖,避免在全部子圖上進行匹配。
常用圖索引方法
- 基於路徑索引:把圖上所有長度小於某特定值的路徑收集起來,並根據這些路徑爲圖數據庫中的子圖建立倒排索引。
- 匹配過程:首先從匹配圖中抽取具有代表性的路徑,然後利用索引檢索獲得所有包含這些路徑的候選子圖,最後在候選子圖上進行同構測試獲得最終的結果。
- 優點:圖的路徑獲取簡單直接 ==》構建索引比較方便
- 缺點:隨着路徑長度的增加,路徑數目呈指數級增長,對於大規模KG,消耗巨大存儲空間,增加檢索時間;不同路徑對子圖的區分性差異很大,區分性低的路徑對於降低搜索空間的效果有限。
- 基於子圖的索引方法:將子圖作爲索引的特徵。
- 關鍵問題:如何在保證區分性的條件下減小索引的規模。
- 常用方法:在構建索引時,通過在KG上挖掘出頻繁子圖作爲建立索引的依據。
- 頻繁子圖的衡量指標:頻繁度——子圖出現的次數
- 頻繁度的設置需精心挑選。
(2)子圖同構判定
常用算法:Ullmann算法(也稱枚舉算法)——能夠枚舉出所有的同構子圖