【知识图谱】知识存储
文章目錄
- 一、圖數據庫
- 1、概述
- 2、開源數據庫介紹
- (1)RDF4J
- (2)gStore
- 3、商業數據庫介紹
- (1)Virtuoso
- (2)Allgrograph
- (3)Stardog
- 4、原生數據庫介紹
- (1)Neo4J
- (2)OrientDB
- (3)Titan
- 5、Benchmark
- 二、知識存儲的示例
- 1、背景
- 2、準備工作
- 3、查詢示例
- 4、增加示例
- 5、刪除示例
本文首先對圖數據進行介紹,其中主要包括開源數據庫(eg:RDF4J、gStore)、商業數據庫(eg:Virtuoso、AllegroGraph和Stardog)和原生的圖數據庫(eg:Neo4j、OrientDB和Titan);之后介紹一個基于Apache Jena數據的示例。
一、圖數據庫
1、概述
圖數據庫(Graph Database) 源起歐拉和圖理論 (graph theory),也可稱為面向/基于圖的數據庫。
- 基本含義:以“圖”這種數據結構存儲和查詢數據。
- 數據模型:主要是以節點和關系(邊)來體現,也可處理鍵值對。
- 優點:快速解決復雜的關系問題。
圖具有如下特征:
- 包含:節點和邊;
- 節點上有屬性 (鍵值對),邊也可以有屬性;
- 邊有名字和方向,并總是有一個開始節點和一個結束節點;
圖數據庫的分類
- 原生數據庫:包括基于main memory和基于disk。
- 非原生數據庫
- RDBMS:基于關系數據庫
- Schema-based:需要設計表結構
- Schema-free:不需要設計表結構,eg:Triple表
- 基于NoSQL
- Key-value:eg:Redis
- Column family:列數據庫
- Document store:eg:MongoDB
- Graph database:eg:Neo4j(廣義上的原生數據庫)
- RDBMS:基于關系數據庫
2、開源數據庫介紹
(1)RDF4J
RDF4J
- 處理RDF數據的Java框架
- 使用簡單可用的API來實現RDF存儲
- 支持SPARQL endpoints
- 支持兩種RDF存儲機制
- 支持所有主流的RDF文件格式
(2)gStore
gStore——C++編寫,查詢速度快,推薦使用
- gStore從圖數據庫角度存儲和檢索RDF知識圖譜數據;
- gStore支持W3C定義的SPARQL 1.1標準,包括含有Union,OPTIONAL,FILTER和聚集函數的查詢;gStore支持有效的增刪改操作
- gStore單機可以支持1Billion(十億)三元組規模的RDF知識圖譜的數據管理任務。
3、商業數據庫介紹
(1)Virtuoso
Virtuoso
- 智能數據,可視化與整合;
- 可擴展和高性能的數據管理;
- 支持 Web 擴展和安全
(2)Allgrograph
Allgrograph
- 一個現代的,加載速度、查詢速度、高性能的,支持永久存儲的圖數據庫;
- 基于 Restful 接入支持多語言編程
(3)Stardog
Stardog:一個企業級的知識圖譜數據庫。使用Stardog,可以統一、查詢、搜索和分析所有數據。
4、原生數據庫介紹
(1)Neo4J
Neo4J 是一個高性能的 NOSQL 圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。
Neo4J 具有以下特性:
- 圖數據庫 + Lucene索引
- 支持圖屬性
- 支持ACID
- 高可用性
- 支持320億的結點,320億的關系結點,640億的屬性
- REST API 接口
數據結構:
- 一個圖包含的基本的數據類型:Nodes (節點) 和 Relationships (關系)。
- Nodes 和 Relationships 包含 key/value 形式的屬性。Nodes通過Relationships所定義的關系相連起來,形成關系型網絡結構。
Neo4j的優點為: - 便于構建多元組:高連通數據
- 支持圖計算:路徑查找、A*算法
- 數據優先
Neo4j數據導入:
- Cypher CREATE 語句,為每一條數據寫一個CREATE;
- Cypher LOAD CSV 語句,將數據轉成CSV格式,通過 LOAD CSV 讀取數據;
- 官方提供的Java API — Batch Inserter;
- 官方提供的 neo4j-import 工具;
- 第三方開發者編寫的 Batch Import 工具。
Neo4j數據存儲:
Neo4j查詢數據:使用 Cypher 查詢語言(基于遍歷)
(2)OrientDB
OrientDB:一個用Java實現的開源NoSQL數據庫管理系統。
它是一個多模式的數據庫,支持圖形、文檔、鍵值對、對象模型和關系,也可以為圖數據庫的管理與記錄之間的提供連接。
(3)Titan
Titan 的適用性:小規模不推薦使用
特點
- 彈性和線性增長的數據和用戶的可擴展性;
- 數據分布和復制性能和容錯性;
- 支持增刪改查,支持一致性;
- 支持各種后端存儲;
- 支持全局圖數據分析,報告,并通過ETL連接大數據平臺;
- 支持全文檢索
5、Benchmark
網站:https://www.w3.org/wiki/RdfStoreBenchmarking
常用衡量指標:
- Load Time
- Repository Size:
- 當知識圖譜越大時,希望讀寫性能呈線性增長時的斜率低 ==》擴展性越強
- Query Response Time
- 單Query:是否使用了Cache(緩存:系統緩存、數據庫緩存)
- 多Query:mix query使得cache失效,大多存在與冷啟動,即cache無預先保存與Query相關的結果情況
- Throughputs:單Query、多Query
- Inference Support
二、知識存儲的示例
Jena是一個免費開源的支持構建語義網絡和數據鏈接應用的Java框架。
- 底層存儲支持基于內存、基于SDB(導入關系數據庫)、基于TDB(導入原生的三元組數據)和基于custom的存儲;
- 同時Jena還支持一些推理的API;
- RDF API,支持基于SPARQL語言的查詢;
- 可使用Fuseki進行增刪查改。
1、背景
定義一個音樂知識圖譜的 Schema 如下:
- Schema中的藍線指向屬性,綠線指向實體,虛線指向圖譜生成之后添加的屬性,后面通過 SPARQL Update 語句添加。
2、準備工作
數據生成:
使用python腳本生成了1000個音樂知識圖譜的三元組:
數據導入:
- 使用TDB導入
使用tdbloader工具的命令為:/jena-fuseki/data 是存儲的位置。/jena-fuseki/tdbloader --loc=/jena-fuseki/data filename - 使用Fuseki導入
啟動Fuseki服務:
在導入數據之后我們可以使用接口對我們的數據進行查詢,于是我們使用Fuseki Server進行查詢,啟動命令如下,注意此處需要指定TDB生成的文件路徑和數據庫名:其中 /music 是剛剛導入的數據
數據庫查詢方法:
- Fuseki界面查詢;
- 使用endpoint接口查詢,endpoint地址為:
- SPARQL Query: http://localhost:3030/music/query
- SPARQL Update: http://localhost:3030/music/update
- Python操作Jena
- 使用Jena SPARQL endpoint接口進行查詢和更新
- 使用SPARQLWrapper包查詢和更新(詳見https://rdflib.github.io/sparqlwrapper/)
3、查詢示例
(1)查詢某一藝術家的所有歌曲
PREFIX music:<http://kg.course/music/>SELECT DISTINCT ?trackID WHERE {?trackID music:track_artist music:artist_01 }(2)查詢某一藝術家的所有歌曲的歌曲名
PREFIX music:<http://kg.course/music/>SELECT ?name WHERE {?trackID music:track_artist music:artist_01 .?trainID music:track_name ?name }(3)查詢某一首歌曲名的專輯信息
PREFIX music:<http://kg.course/music/>SELECT ?trackID ?albumID ?name WHERE {?trackID music:track_name "track_name_00001" .?trackID music:track_album ?ablumID .?ablumID music:album_name ?name }(4)查詢某一首歌曲名的專輯信息,使用中文來當變量名
PREFIX music:<http://kg.course/music/>SELECT ?歌曲ID ?專輯ID ?專輯名 WHERE {?歌曲ID music:track_name "track_name_00001" .?歌曲ID music:track_album ?專輯ID .?專輯ID music:album_name ?專輯名 }(5)查詢某一首歌曲名的專輯信息,變量名添加描述
PREFIX music:<http://kg.course/music/>SELECT ?歌曲ID ?專輯ID (CONCAT("專輯名",":",?專輯名) AS ?專輯信息) WHERE {?歌曲ID music:track_name "track_name_00001" .?歌曲ID music:track_album ?專輯ID .?專輯ID music:album_name ?專輯名 }(6)查詢某個專輯里面的所有歌曲
PREFIX music:<http://kg.course/music/>SELECT ?trackID WHERE {?albumID music:ablum_name "ablum_name_00002"?trackID music:track_ablum ?albumID }(7)查詢某個專輯里面的所有歌曲,限制前2
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>SELECT ?S ?P WHERE {?subject ?predicate "ablum_name_0002" .?S ?P ?subject } limit 2(8)對某個專輯里面的所有歌曲計數
PREFIX music: <http://kg.course/music/>SELECT (COUNT(?trackID) as ?num) WHERE {?albumID music:album_name "album_name_0002" . ?trackID music:track_album ?albumID }(9)查詢某一首歌是哪一個藝術家的作品
PREFIX music: <http://kg.course/music/>SELECT ?trackID ?artistID WHERE { ?trackID music:track_name "track_name_00001" . ?trackID music:track_artist ?artistID }(10)查詢某一首歌屬于什么歌曲類型
PREFIX music: <http://kg.course/music/>SELECT ?trackID ?tag_name WHERE { ?trackID music:track_name "track_name_00001" . ?trackID music:track_tag ?tag_name }(11)查詢某一藝術家唱過歌曲的所有標簽
PREFIX music: <http://kg.course/music/>SELECT DISTINCT ?tag_name WHERE { ?trackID music:track_artist music:artist_001 . ?trackID music:track_tag ?tag_name }(12)查詢某一藝術家唱過歌曲的所有類型并排序
PREFIX music: <http://kg.course/music/>SELECT DISTINCT ?tag_name WHERE { ?trackID music:track_artist music:artist_001 . ?trackID music:track_tag ?tag_name } ORDER BY ?tag_name(13)查詢某幾類歌曲標簽中的歌曲的數目
PREFIX music: <http://kg.course/music/>SELECT (count(?trackID) AS ?num) WHERE { {?trackID music:track_tag "tag_name_01" .}UNION{?trackID music:track_tag "tag_name_02" .} }PREFIX music: <http://kg.course/music/>SELECT (count(?trackID) AS ?num) WHERE {?trackID music:track_tag ?tag_nameFILTER (?tag_name = "tag_name_001" || ?tag_name = "tag_name_002") }(14)查詢所有歌曲中帶有’xx’字符的歌曲名
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>SELECT ?subject ?object WHERE {?subject <http://kg.course/music/track_name> ?object .FILTER regex(?object,"088") }(15)詢問是否存在帶有’xx’字符的歌曲名
PREFIX music: <http://kg.course/music/> ASK { ?trackID music:track_name ?track_name . FILTER regex(?track_name,"008") }4、增加示例
給藝術家id新增屬性藝術家名字
PREFIX music: <http://kg.course/music/>INSERT DATA {music:arttist_01 music:artist_name "artist_name_01" . music:arttist_02 music:artist_name "artist_name_02" .music:arttist_03 music:artist_name "artist_name_03" . }查詢測試
PREFIX music: <http://kg.course/music/>SELECT ?artistID ?artist_name WHERE {?artistID music:artist_name ?artist_name }5、刪除示例
刪除增加的屬性藝術家名字
PREFIX music: <http://kg.course/music/>DELETE { music:artist_02 music:artist_name ?x . } WHERE { music:artist_02 music:artist_name ?x . }查詢測試
PREFIX music: <http://kg.course/music/>SELECT ?artistID ?artist_name WHERE {?artistID music:artist_name ?artist_name } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【知识图谱】知识存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【知识图谱】知识抽取与挖掘(Ⅱ)
- 下一篇: 【知识图谱】知识融合