CAS-KG——知识图谱数据的存储与检索
說明:CAS是國科大的簡稱,KG是知識圖譜的縮寫,這個欄目之下是我整理的國科大學習到的知識圖譜的相關筆記。
課程目標
- 了解以知識圖譜為代表的大數據知識工程的基本問題和方法
- 掌握基于知識圖譜的語義計算關鍵技術
- 具備建立小型知識圖譜并據此進行數據分析應用的能力
教學安排
詳情請見博客:CAS-KG——課程安排
文章目錄
- 1. 知識圖譜大數據
- 知識圖譜相關概念
- 應用方向
- 大規模圖數據特點
- 知識圖譜數據管理
- 2. 知識圖譜數據模型
- RDF圖模型
- 屬性圖模型
- 比較
- 3. 知識圖譜數據的存儲
- 基于表結構的存儲
- 三元組表
- 類型表
- 關系數據庫
- 基于圖結構的存儲
- 4. 知識圖譜數據的檢索
- 聲明式查詢語言
- SPARQL語言
- Cypher
- PGQL
- G-CORE
- 過程式查詢語言
- Gremlin
- 5. Neo4j使用簡介
- 6. 總結
1. 知識圖譜大數據
知識圖譜相關概念
語言與圖譜:知識載體
知識圖譜是完全形式化的,方便機器進行處理。
知識圖譜
知識圖譜是一種有向圖結構,描述了現實世界中存在的實體、事件或者概念以及它們之間的相關關系。
- 實體:Cristiano Ronaldo, Jos Dinis Aveiro, Real Madrid CF、馬賽約等
- 實體類型:人物、國家、城市、組織機構等
- 屬性:人物有姓名、性別、出生日期、興趣愛好、職業等屬性;
國家有國慶日、國家代碼、貨幣、時區、等屬性 - 關系:人物和人物間的同事關系、人物和國家間的國籍關系、城市和國家間的屬于關系等
知識圖譜中的知識表示
知識圖譜中的知識是通過RDF的結構進行表示的,其基本構成單元是事實三元組,每個事實被表示為一個形如<subject, predicate, object>的三元組。
- subject: 主體(也稱主語),其取值通常是實體、事件或者概念中的任何一個
- predicate:謂詞(也稱謂語),其取值通常是關系或者屬性
- object:客體(也稱賓語),其取值既可以是實體、事件、概念,也可以是普通的值(如數字、字符串等)
知識圖譜中的知識表示(示例)
知識圖譜中的知識是通過RDF的結構進行表示的,其基本構成單元是事實,每個事實被表示為一個形如<subject, predicate, object>的三元組。
- 實體:Pepe, Real Madrid CF、Maceio
- 屬性:gender, height, date of birth, capacity, short name, creation date, area, elevation, postal code
- 屬性值:male, 1.88m, 1983/02/26, 81,044, RM, 1902/03/06, 511km2, 7m, 57000-000
- 關系:team, place of birth
知識圖譜:圖數據
- 屬性(自身性質)
- 拓撲結構(相互關系)
應用方向
廣泛應用的大規模圖結構數據
應用方向:社交網絡
應用方向:路徑規劃
求取首都機場到中科院自動化所乘地鐵的最短距離或最快交通線路
應用方向:生物學
圖結構在生物學上已經得到廣泛應用
應用方向:有機化學
化合物的性質與復雜化學反應的分析
應用方向:軟件剽竊檢測
目前軟件剽竊檢測的新方法是基于圖模式匹配,將代碼先轉化為程序依賴圖,然后再通過圖匹配方法進行檢測
應用方向:健康醫療大數據
運用健康醫療大數據構建知識圖譜
大規模圖數據特點
大規模圖數據特點
- “4V”特點
? 規模浩大(Volume)
? 生成快速(Velocity)
? 種類繁多(Variety)
? 可靠性(Veracity)
- 傾斜的度分布
- 小世界現象
- 不清晰的社區結構
總的來說 - 局部特征多樣性
- 關聯數據復雜性
- 拓撲結構時變性
知識圖譜:大規模圖數據
知識圖譜數據管理
知識圖譜的目標是構建一個能夠刻畫現實世界的知識庫,為自動問答、信息檢索等應用提供支撐。因此,對知識的持久化存儲并提供對目標知識的高效檢索是合格的知識圖譜(系統)必須具備的基本功能。
- 知識圖譜數據模型
? RDF圖模型
? 屬性圖模型 - 知識圖譜數據的存儲
? 基于表結構的存儲
? 基于圖結構的存儲 - 知識圖譜數據的檢索
? 聲明式查詢語言
? 過程式查詢語言
2. 知識圖譜數據模型
RDF圖模型
G={(屠呦呦,type,藥學),
(屠呦呦,Birth_date,1930-12-30),
(屠呦呦,Citizenship,中國),
(屠呦呦,Name,”屠呦呦”),
(諾貝爾醫學獎,Awarded,屠呦呦),
(諾貝爾醫學獎,type, Nobel Prizes),
(諾貝爾醫學獎,Name, Nobel Prize in Physiology or Medicine),
(諾貝爾醫學獎,Location, Stockholm, Sweden),
(諾貝爾醫學獎,Reward(s), 9 million SEK (2017)} 9個三元組
上述描述有以下問題:
- 沒有對頂點和邊上屬性的內置支持
- 如何表示邊上的屬性?“具體化”(reification,CVT)
- 頂點與邊交集非空:3-uniform hyper-graph(3均勻超圖)
定義一個虛擬節點,如下圖紅色節點描述一個原本不可描述的事件。
屬性圖模型
屬性圖G是5元組:𝑮 = (𝑽, 𝑬, 𝝆, 𝝀,𝝈)
- V:頂點的有限集合
- E:邊的有限集合
- 𝝆:𝑬 → (𝑽 ×𝑽):將邊關聯到頂點對
- 𝝀:(𝑽 ∪ 𝑬) → 𝑳𝒂𝒃:為頂點或邊賦予標簽
- 𝝈: (𝑽 ∪ 𝑬) ×𝑷𝒓𝒐𝒑 → 𝑽𝒂𝒍:為頂點或邊關聯屬性
比較
知識圖譜數據模型典型示例
- 更類似RDF圖模型的圖譜:Freebase
- 更類似屬性圖模型的圖譜:WikiData
3. 知識圖譜數據的存儲
知識存儲方式
- 以類別為中心:基于表的存儲
? 關系數據庫
- 以實體為中心:基于圖的存儲
? RDF為基礎的Semantic Web
- 可相互轉換
基于表結構的存儲
三元組表
三元組表
知識圖譜中的事實是一個個的三元組,一種最簡單直接的存儲方式是設計一張三元組表用于存儲知識圖譜中所有的事實。
三元組表特性
基于三元組表的存儲方式的優點是簡單直接,易于理解;然而缺點也非常明顯,主要有以下幾點:
- 每個字段包含不同類型、不同結構的數據。
- 整個知識圖譜都存儲在一張表中,導致單表的規模太大。對大表進行查詢、插入、刪除、修改等操作的開銷很大,這將導致知識圖譜的實用性大打折扣。
- 復雜查詢在這種存儲結構上的開銷巨大。由于數據表只包括三個字段,因此復雜的查詢只能拆分成若干簡單查詢的復合操作,大大降低了查詢的效率。例如,查詢“佩佩的身高和性別是什么?”需要拆分為“佩佩的身高是多少?”和“佩佩的性別是什么?”
三元組表的六重索引
-
六重索引
- SPO、SOP、PSO、POS、OSP、OPS
- Hexastore [Weiss08, VLDB], RDF-3X [Neumann08, VLDB]
-
優點:
? 三元組模式查詢(triple pattern)的高效執行
? 任意兩個三元組模式的高效歸并連接(merge-join) -
問題:
? 6倍空間開銷?
? 更新維護代價
類型表
為每種類型構建一張表,同一類型的實例存放在相同的表中。表的每一列表示該類實體的一個屬性,每一行存儲該類實體的一個實例。
類型表的不足
- 大量數據字段的冗余存儲。假設知識圖譜中既有“演員”也有“歌手”,那么同屬于這兩個類別的實例將會同時被存儲在這兩個表中,其中它們共有的屬性會被重復存儲。
- 大量的數據列為空值。通常知識圖譜中并非每個實體在所有屬性或關系上都有值,這種存儲方式會導致表中存在大量的空值。
- 多值屬性不便于存儲
考慮層級關系的類型表
構建數據表時,將知識圖譜的類別體系考慮進來。具體來說,每個類型的數據表只記錄屬于該類型的特有屬性,不同類別的公共屬性保存在上一級類型對應的數據表中,下級表繼承上級表的所有屬性。
類型表特性
類型表克服了三元組表面臨的單表過大和結構簡單的問題,但是也有明顯的不足之處:
- 由于數據表是和具體類型對應的,不同的數據表具有不同的結構,因此在查詢之前必須知道目標對象的類型才能確定查找的數據表。
- 當查詢涉及到不同類型的實體時,需要進行多表的連接,這一操作開銷巨大,限制了知識圖譜對復雜查詢的處理能力。
- 知識圖譜通常包含豐富的實體類型,因此需要創建大量的數據表,并且這些數據表之間又具有復雜的關系,這為數據的管理增加了很大的難度
關系數據庫
基本概念
關系數據庫以二維表結構對數據進行組織和存儲。
- 屬性 (attribute):表中的每一列稱為一個屬性(也稱字段),用來描述實體集的某個特征。每個屬性都有自己的取值范圍,稱為域。
- 元組 (tuple):表中的每一行由一個實體的相關屬性取值構成,稱為元組(也稱記錄),它相對完整地描述了一個實體。元組中的一個屬性值稱為分量。
上述二維表格有以下限制:
- 每一屬性必須是基本的、不能再拆分的數據類型,如整型、實型、字符型等。結構或數組不能作為屬性的類型。
- 屬性的所有值必須是同類型、同語義的。如果某一列包含學生的學號,則該表中所有行的此列都必須是學生的學號。
- 屬性的值只能是域中的值。例如學生的性別只能在“男”或“女”中取值。
- 屬性必須有唯一的名字,但不同的屬性可以出自相同的域。列在表中的順序可以任意交換。
- 任意兩個元組的值不能完全相同,即不允許有重復的行。行在表中的順序可以任意交換。
關系數據庫屬性分類
候選碼:能夠唯一標識元組的最小的屬性集合。
- 唯一性:候選碼在整個表的范圍內必須具有唯一的值,不同元組不能具有相同的候選碼值。
- 最小性:候選碼所包括的屬性必須都是必不可少的,缺少其中的任何一個都不再具備唯一性。
- 例如,在上表中學生的學號、身份證號分別都可以作為候選碼;但是(學號, 身份證號)這一屬性組不能作為候選碼,因為去掉其中任何一個剩下的屬性仍然可以作為候選碼,因此不滿足最小性。
主碼:一個數據表可以包含多個候選碼,從中任意選取一個作為主碼。雖然理論上所有的候選碼都可以作為主碼,但是實際操作中一般選擇單屬性組成的候選碼作為主碼。
- 在該表中有三個候選碼:學號、身份證號、姓名(不重名)。
- 姓名作主碼還是有些限制(不能重名);
- 身份證號太長,使用不方便;
- 學號簡潔,使用方便,在實際生活中也被用來唯一區分學生,所以選學號作主碼最合適。
外碼:如果數據表中的某個屬性或屬性組是其它表的候選碼,那么稱該屬性或屬性組是當前表的外碼。外碼能夠保證不同數據表之間數據的一致性。
- 班號是班級表的候選碼,所以班號是學生表的外碼。
主屬性與非主屬性:包含在任何候選碼中的屬性稱為主屬性;相反地,不包含在任何候選碼中的屬性稱為非主屬性。
關系數據庫完整性約束
關系數據庫通過關系完整性約束條件來保證數據的正確性和一致性。所謂關系完整性約束條件主要是指在表和屬性(列)上定義的規則,數據庫管理系統會依據這些約束條
件維護數據完整性。
- 域完整性規則
- 實體完整性規則
- 參照完整性規則
域完整性規則
在關系數據模型定義時,由用戶對屬性值的數據類型、長度、單位、精度、格式、值域范圍、是否允許為空值等進行限定,規定屬性取值必須在其值域中。
實體完整性:
元組(記錄)在構成主碼的屬性上不能有空值且主碼的值不能相同。實體完整性主要是為了確保主碼能唯一標識元組。
參照完整性:
一個外表的外碼取值必須是其主表主碼的存在值或空值。
- 學生表中班號的取值必須是空值(當事人不知道,所以設為空)或在班級表中班號屬性中出現過的值。如果學生表的班號字段允許為空,它取空值表示該學生還沒有確定班級;否則只能取班級表出現過的班號值。
關系數據庫操作語言
- 關系數據庫的基本操作語言是SQL 。
- SQL語言以簡潔的語法支持關系數據庫的各類操作(插入/修改/刪除/查詢)。
- SQL語言獨立于關系數據庫本身,獨立于使用的機器、網絡和操作系統。
如果選擇關系數據庫作為知識圖譜的存儲引擎,那么對知識圖譜的所有操作都需要轉換為SQL語句才能執行。
關系數據庫通過SQL語言為用戶提一系列的操作接口,其核心功能包括插入、修改、刪除、查詢四種操作。
- 插入 (INSERT):在一個表中插入一條或多條新記錄。
- 修改 (UPDATE):在一個表中修改滿足條件的記錄的某些字段的值。
- 刪除 (DELETE):從一個表中刪除一條或多條滿足條件的記錄。
- 查詢 (SELECT):從一個或多個表中提取滿足條件的數據、生成計算列或匯總數據。
常見的關系數據庫存儲系統
基于圖結構的存儲
將實體看做節點,關系看做帶有標簽的邊,那么知識圖譜的數據很自然地滿足圖模型結構。
圖數據庫基于有向圖,其理論基礎是圖論。節點、邊和屬性是圖數據庫的核心概念。
- 節點:節點用于表示實體、事件等對象,可以類比于關系數據庫中的記錄或數據表中的行數據。例如人物、地點、電影等都可以作為圖中的節點。
- 邊:邊是指圖中連接節點的有向線條,用于表示不同節點之間的關系。例如人物節點之間的夫妻關系、同事關系等都可以作為圖中的邊。
- 屬性:屬性用于描述節點或者邊的特性。例如人物的姓名、夫妻關系的起止時間等都是屬性。
圖數據模型:節點、邊、節點屬性、邊屬性
- 節點存儲(node store)
- 關系存儲(relationship store)
- 屬性存儲(property store)
問題:單機系統可擴展性不足,圖查詢復雜度高
常見的圖數據庫存儲系統
4. 知識圖譜數據的檢索
知識圖譜查詢語言
聲明式查詢語言
語義網回顧
本質:以Web數據的內容(即語義)為核心,用機器能夠理解和處理的方式鏈接起來的海量分布式數據庫。
RDF回顧
RDF(Resource Description Framework,資源描述框架)是一種資源描述語言,其核心思想是利用Web標識符(URI)來標識事物,通過指定的屬性和相應的值描述資源的性質或資源之間的關系。
SPARQL語言
SPARQL是Simple Protocol and RDF Query Language的縮寫,是由W3C為RDF數據開發的一種查詢語言和數據獲取協議,是被圖數據庫廣泛支持的查詢語言。和SQL類似,SPARQL也是一種結構化的查詢語言,用于對數據的獲取與管理.
- 數據操縱(插入、刪除、更新)
- 數據查詢
數據操縱
數據插入:將新的三元組插入到已有的RDF圖中。SPARQL通過INSERT DATA語句完成該功能,其基本語法為:
INSERT DATA 三元組數據
- 三元組數據可以是多條三元組,不同的三元組通過“;” 分隔。如果待插入的三元組在RDF圖中已經存在,那么系統會忽略該三元組。
例 將以下兩條三元組插入到圖1所示的RDF圖中。
<http://example/movie1> ns:producer <http://example/person2> <http://example/movie1> ns:writer <http://example/person3>
數據刪除:從RDF圖中刪除一些三元組。SPARQL通過DELETE DATA語句完成該功能,其基本語法為:
DELETE DATA 三元組數據
- 其中三元組數據可以是多條三元組,不同的三元組通過“;” 分隔。對于給定的每個三元組,如果其在RDF圖中,則將其從圖中刪除,否則忽略該三元組。
例 將以下三元組從圖2所示的RDF圖中刪除。
<http://example/movie1> ns:producer <http://example/person2>
數據更新:更新RDF圖中指定三元組的值。和SQL不同,SPARQL沒有定義UPDATE操作,也就是說SPARQL語言沒
有直接更新已有數據的方法。但是,可以通過組合INSERT DATA語句和DELETE DATA語句來實現該功能。
- DELETE DATA:刪除待修改的三元組;
- INSERT DATA:插入修改后的三元組。
例 將圖3中三元組 (http://example/movie1 ns:director http://example/person1) 的客體http://example/person1 修改為http://example/person4。
數據查詢
SPARQL提供了豐富的數據查詢功能,包括四種形式:
- SELECT:最為常用的查詢語句,其功能和SQL中的SELECT語句類似,從知識圖譜中獲取滿足條件的數據。
- ASK:用于測試知識圖譜中是否存在滿足給定條件的數據,如果存在則返回“yes”,否則返回“no”,該查詢不會返回具體的匹配數據。
- DESCRIBE:用于查詢和指定資源相關的RDF數據,這些數據形成了對給定資源的詳細描述。
- CONSTRUCT:則根據查詢圖的結果生成RDF。
SELECT語句
ASK語句
DESCRIBE語句
CONSTRUCT語句
RDF圖查詢語言:SPARQL
W3C RDF 標準查詢語言
- 三元組模式(triple pattern)
- 基本圖模式(basic graph pattern)
- 復雜圖模式(complex graph pattern)
Cypher
- 標準化工作:openCypher
- https://www.opencypher.org
PGQL
Oracle在2016年提出:Oracle PGX
- 與Cypher相比,PGQL完整地支持正則路徑查詢語義
- 與SPARQL屬性路徑僅支持邊標簽構成的正則路徑不同,
- PGQL通過路徑模式(path pattern)表達式定義,還支持正則路徑中含有頂點標簽條件以及頂點(或邊)屬性值比較
- 在提高了屬性圖上正則路徑查詢表達力(expressiveness)的同時保持求值復雜度(complexity)不變
G-CORE
LDBC圖查詢語言工作組設計
- 充分借鑒和融合各種已有圖查詢語言的優點,在查詢表達力和求值復雜度之間尋求最佳平衡
G-CORE與已有圖查詢語言相比
- 查詢的輸入輸出均是圖,徹底實現了圖查詢語言的可組合性(composability)
- 將路徑作為與頂點和邊同等重要的圖查詢處理基本元素
過程式查詢語言
Gremlin
- Apache TinkerPop圖計算框架
- 過程式語言:圖遍歷、導航式游走
- 更像一種函數式的編程語言接口
5. Neo4j使用簡介
Neo4j的特點
- 查詢語言Neo4j CQL(與Cyper類似)
- 遵循屬性圖數據模型
- 支持UNIQUE約束
- 包含一個用于執行CQL命令的UI
- 支持完整的ACID規則
- 支持查詢數據導出到JSON與XLS格式
- 提供了REST API,可以被任何編程語言訪問
- 支持兩種Java API:Cypher API 和Native Java API 來開發Java應用程序
Neo4j的優點與缺點
一、優點
- 易于學習
- 易于表示半結構化數據
- 性能出眾,加載數據快,內存占用低,只需選擇需要導入的數據,無需考慮數據大小
- 簡單而強大的數據模型
二、缺點 - 支持節點數、關系和屬性有限制
- 不支持SPARQL查詢(樸素得講)
? 但是可以插件支持: https://github.com/neo4j-contrib/sparql-plugin - 不支持Sharding
Neo4j的獲取與啟動
一、從網址 https://neo4j.com/download/ 下載Neo4j Server
二、社區版免費,根據自己系統需要選擇合適版本(以Linux/Mac 為例)
三、將下載文件解壓,修改名稱(例如:NEO4J_HOME ),并在終端NEO4J_HOME的bin目錄下輸入命令:./neo4j console(注: 該步驟需要確保安裝JDK1.8及以上版本)
四、打開瀏覽器訪問 http://localhost:7474/ ,默認密碼neo4j
五、登錄完成后的Launcher提供了一部分CQL示例,點擊Movie Graph,運行示例代碼,創建該圖數據庫
CQL語言
Neo4j CQL——節點&關系
Neo4j CQL——CREATE
Neo4j CQL——MATCH
Neo4j CQL——RETURN
Neo4j CQL——DELETE&REMOVE&SET
Neo4j CQL——WHERE
Neo4j CQL——ORDER BY&UNION
Neo4j CQL——LIMIT&SKIP&IN
CQL語言
Neo4j CQL——字符串函數
Neo4j CQL——聚合函數
Neo4j CQL——關系函數
Neo4j——知識圖譜的構建
1.打開IDEA,新建Java Project
2.打開Project Structure對話框,導入jar文件
3.創建Neo4j數據庫
4.啟動數據庫
5.定義節點類型player,team
6.定義關系類型play_in
7.創建新節點 playerNode, teamNode,并設置它們的屬性
8.創建新關系relationship,并設置其屬性
9.運行代碼,創建數據庫
10.代碼運行成功后,打開Neo4j數據庫目錄下的conf中的配置文件,
將第九行內容改為下圖所示:
11.啟動數據庫,瀏覽器訪問 http://localhost:7474 查看結果
6. 總結
知識圖譜
知識圖譜中的知識表示
知識圖譜數據模型
知識存儲方式
基于圖結構的存儲模型
知識圖譜查詢語言
常見圖數據庫平臺
知識圖譜數據管理
- 查詢語言的統一
- 分布式存儲方案
- 分布式查詢處理
- 知識推理的支持
- 大規模知識圖譜的更新維護
總結
以上是生活随笔為你收集整理的CAS-KG——知识图谱数据的存储与检索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杯具-箴言
- 下一篇: Python手绘图案出现MemoryEr