知識圖譜中的知識是通過RDF結構來進行表示的,其基本單元是事實。每個事實是一個三元組(S, P, O),在實際系統中,按照存儲方式的不同,知識圖譜的存儲可以分為基於表結構的存儲和基於圖結構的存儲。
基於表結構的存儲可以用關系型數據庫,常見的關系型數據庫存儲系統有MySQL、Oracle、DB2、Microsoft SQL Server等;基於圖結構的存儲,常見的存儲系統有Neo4j、OritentDB、InfoGrid、HyperGraphDB、infiniteGraph等。下面講述Neo4j數據庫的一些理論和操作。
圖數據庫的理論基礎是圖論,通過節點、邊和屬性對數據進行表示和存儲。具體來說,圖數據庫基於有向圖,其中,節點、邊、屬性是圖數據庫的核心概念。
(1)節點
節點用於表示實體、事件等對象,可以類比於關系數據庫中的記錄或者數據表中的行數據。例如人物、地點、電影都可以作為圖中的節點。
(2)邊
邊是指圖中連接節點的有向線條,用於表示不同節點之間的關系。例如人物之間的同事關系都可以作為圖中的邊。
(3)屬性
屬性用於描述節點或者邊的特性。例如人物(節點)的姓名、性別、愛好等都是屬性。
圖數據庫的標准查詢語言是SPARQL。SPARQL是由W3C為RDF數據開發的一種查詢語言和數據獲取協議,是被圖數據庫廣泛支持的查詢語言,用於對數據的獲取與管理,主要包括數據的插入、刪除和查詢操作,沒有更新操作。
下面來介紹SPARQL語言的使用方法。
1. 數據插入
數據插入指新的三元組插入到已有的RDF圖中,通過INSERT DATA語句完成該功能。
語法:INSERT DATA 三元組數據
例子:
INSERT DATA {
ns: 費米 ns: 老師 ns:玻恩.
ns: 玻恩 ns: 類型 ns: 數學家.
ns: 玻恩 ns: 類型 ns: 物理學家.
}
2. 數據刪除
數據刪除是從RDF圖中刪除一些三元組。通過DELETE DATA語句完成該功能。
語法:DELETE DATA三元組數據
例子:
DELETE DATA {
ns: 奧本海默 ns: 類型 ns: 物理學家.
}
可以用WHERE來作限制。
例子:
DELETE DATA {
ns: 奧本海默 ?p ?o.
?s ?p ns: 奧本海默.
}
3. 數據更新
數據更新是指更新RDF圖中指定三元組的值。和SQL不同,SPARQL沒有定義UPDATE操作,也就是說SPARQL語言沒有更新已有數據的方法。但是可以通過組合INSERT DATA語句和DELETE DATA語句來實現該功能。
例子:
DELETE DATA {
ns: 費米 ns: 出生日期 "1902/09/29".
}
INSERT DATA {
ns: 費米 ns: 出生日期 "1901/09/29"
}
4. 數據查詢
包括四種方式:SELECT、ASK、DESCRIBE、CONSTRUCT。以下一一介紹着四種方式的用法和區別。
(1)SELECT
SELECT功能與SQL中的SELECT語句類似,從知識圖譜中獲取滿足條件的查詢語句。
語法:SELECT 變量1 變量2 ... WHERE 圖模式[修飾符]
例子:查詢類型既是"數學家"又是"物理學家"。
SELECT ?s
WHERE {
?s ns: 類型 ns: 數學家.
?s ns: 類型 ns: 物理學家.
}
(2)ASK
ASK用於測試知識圖譜中是否存在滿足給定條件的數據,如果存在,返回"yse",否則返回"no",該查詢不會返回具體的匹配數據。
語法:ASK 圖模式
例子:是否存在是"費米"老師的節點
ASK {
ns: 費米 ns: 老師 ?o.
}
(3)DESCRIBE
DESCRIBE用於查詢和指定資源相關的RDF數據,這些數據形成了對給定資源的詳細描述。
語法:DESCRIBE 資源或變量 [WHERE 圖模式]
例子:獲取老師是"玻恩"的節點的所有信息
DESCRIBE ?s WHERE {
?s ns: 老師 ns: 玻恩.
}
(4)CONSTRUCT
CONSTRUCT是根據查詢圖的結果返回RDF。
語法:CONSTRUCT 圖模板 WHERE 圖模式
例子:
CONSTRUCT {
?s ns: 搭檔 ns: 奧本海默.
ns: 奧本海默 ns: 搭檔 ?s.
}
WHERE {
?s ns: 老師 ns: 玻恩.
}