【知识图谱】知识存储
文章目錄
- 一、圖數(shù)據(jù)庫
- 1、概述
- 2、開源數(shù)據(jù)庫介紹
- (1)RDF4J
- (2)gStore
- 3、商業(yè)數(shù)據(jù)庫介紹
- (1)Virtuoso
- (2)Allgrograph
- (3)Stardog
- 4、原生數(shù)據(jù)庫介紹
- (1)Neo4J
- (2)OrientDB
- (3)Titan
- 5、Benchmark
- 二、知識存儲的示例
- 1、背景
- 2、準(zhǔn)備工作
- 3、查詢示例
- 4、增加示例
- 5、刪除示例
本文首先對圖數(shù)據(jù)進行介紹,其中主要包括開源數(shù)據(jù)庫(eg:RDF4J、gStore)、商業(yè)數(shù)據(jù)庫(eg:Virtuoso、AllegroGraph和Stardog)和原生的圖數(shù)據(jù)庫(eg:Neo4j、OrientDB和Titan);之后介紹一個基于Apache Jena數(shù)據(jù)的示例。
一、圖數(shù)據(jù)庫
1、概述
圖數(shù)據(jù)庫(Graph Database) 源起歐拉和圖理論 (graph theory),也可稱為面向/基于圖的數(shù)據(jù)庫。
- 基本含義:以“圖”這種數(shù)據(jù)結(jié)構(gòu)存儲和查詢數(shù)據(jù)。
- 數(shù)據(jù)模型:主要是以節(jié)點和關(guān)系(邊)來體現(xiàn),也可處理鍵值對。
- 優(yōu)點:快速解決復(fù)雜的關(guān)系問題。
圖具有如下特征:
- 包含:節(jié)點和邊;
- 節(jié)點上有屬性 (鍵值對),邊也可以有屬性;
- 邊有名字和方向,并總是有一個開始節(jié)點和一個結(jié)束節(jié)點;
圖數(shù)據(jù)庫的分類
- 原生數(shù)據(jù)庫:包括基于main memory和基于disk。
- 非原生數(shù)據(jù)庫
- RDBMS:基于關(guān)系數(shù)據(jù)庫
- Schema-based:需要設(shè)計表結(jié)構(gòu)
- Schema-free:不需要設(shè)計表結(jié)構(gòu),eg:Triple表
- 基于NoSQL
- Key-value:eg:Redis
- Column family:列數(shù)據(jù)庫
- Document store:eg:MongoDB
- Graph database:eg:Neo4j(廣義上的原生數(shù)據(jù)庫)
- RDBMS:基于關(guān)系數(shù)據(jù)庫
2、開源數(shù)據(jù)庫介紹
(1)RDF4J
RDF4J
- 處理RDF數(shù)據(jù)的Java框架
- 使用簡單可用的API來實現(xiàn)RDF存儲
- 支持SPARQL endpoints
- 支持兩種RDF存儲機制
- 支持所有主流的RDF文件格式
(2)gStore
gStore——C++編寫,查詢速度快,推薦使用
- gStore從圖數(shù)據(jù)庫角度存儲和檢索RDF知識圖譜數(shù)據(jù);
- gStore支持W3C定義的SPARQL 1.1標(biāo)準(zhǔn),包括含有Union,OPTIONAL,FILTER和聚集函數(shù)的查詢;gStore支持有效的增刪改操作
- gStore單機可以支持1Billion(十億)三元組規(guī)模的RDF知識圖譜的數(shù)據(jù)管理任務(wù)。
3、商業(yè)數(shù)據(jù)庫介紹
(1)Virtuoso
Virtuoso
- 智能數(shù)據(jù),可視化與整合;
- 可擴展和高性能的數(shù)據(jù)管理;
- 支持 Web 擴展和安全
(2)Allgrograph
Allgrograph
- 一個現(xiàn)代的,加載速度、查詢速度、高性能的,支持永久存儲的圖數(shù)據(jù)庫;
- 基于 Restful 接入支持多語言編程
(3)Stardog
Stardog:一個企業(yè)級的知識圖譜數(shù)據(jù)庫。使用Stardog,可以統(tǒng)一、查詢、搜索和分析所有數(shù)據(jù)。
4、原生數(shù)據(jù)庫介紹
(1)Neo4J
Neo4J 是一個高性能的 NOSQL 圖形數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務(wù)特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。
Neo4J 具有以下特性:
- 圖數(shù)據(jù)庫 + Lucene索引
- 支持圖屬性
- 支持ACID
- 高可用性
- 支持320億的結(jié)點,320億的關(guān)系結(jié)點,640億的屬性
- REST API 接口
數(shù)據(jù)結(jié)構(gòu):
- 一個圖包含的基本的數(shù)據(jù)類型:Nodes (節(jié)點) 和 Relationships (關(guān)系)。
- Nodes 和 Relationships 包含 key/value 形式的屬性。Nodes通過Relationships所定義的關(guān)系相連起來,形成關(guān)系型網(wǎng)絡(luò)結(jié)構(gòu)。
Neo4j的優(yōu)點為: - 便于構(gòu)建多元組:高連通數(shù)據(jù)
- 支持圖計算:路徑查找、A*算法
- 數(shù)據(jù)優(yōu)先
Neo4j數(shù)據(jù)導(dǎo)入:
- Cypher CREATE 語句,為每一條數(shù)據(jù)寫一個CREATE;
- Cypher LOAD CSV 語句,將數(shù)據(jù)轉(zhuǎn)成CSV格式,通過 LOAD CSV 讀取數(shù)據(jù);
- 官方提供的Java API — Batch Inserter;
- 官方提供的 neo4j-import 工具;
- 第三方開發(fā)者編寫的 Batch Import 工具。
Neo4j數(shù)據(jù)存儲:
Neo4j查詢數(shù)據(jù):使用 Cypher 查詢語言(基于遍歷)
(2)OrientDB
OrientDB:一個用Java實現(xiàn)的開源NoSQL數(shù)據(jù)庫管理系統(tǒng)。
它是一個多模式的數(shù)據(jù)庫,支持圖形、文檔、鍵值對、對象模型和關(guān)系,也可以為圖數(shù)據(jù)庫的管理與記錄之間的提供連接。
(3)Titan
Titan 的適用性:小規(guī)模不推薦使用
特點
- 彈性和線性增長的數(shù)據(jù)和用戶的可擴展性;
- 數(shù)據(jù)分布和復(fù)制性能和容錯性;
- 支持增刪改查,支持一致性;
- 支持各種后端存儲;
- 支持全局圖數(shù)據(jù)分析,報告,并通過ETL連接大數(shù)據(jù)平臺;
- 支持全文檢索
5、Benchmark
網(wǎng)站:https://www.w3.org/wiki/RdfStoreBenchmarking
常用衡量指標(biāo):
- Load Time
- Repository Size:
- 當(dāng)知識圖譜越大時,希望讀寫性能呈線性增長時的斜率低 ==》擴展性越強
- Query Response Time
- 單Query:是否使用了Cache(緩存:系統(tǒng)緩存、數(shù)據(jù)庫緩存)
- 多Query:mix query使得cache失效,大多存在與冷啟動,即cache無預(yù)先保存與Query相關(guān)的結(jié)果情況
- Throughputs:單Query、多Query
- Inference Support
二、知識存儲的示例
Jena是一個免費開源的支持構(gòu)建語義網(wǎng)絡(luò)和數(shù)據(jù)鏈接應(yīng)用的Java框架。
- 底層存儲支持基于內(nèi)存、基于SDB(導(dǎo)入關(guān)系數(shù)據(jù)庫)、基于TDB(導(dǎo)入原生的三元組數(shù)據(jù))和基于custom的存儲;
- 同時Jena還支持一些推理的API;
- RDF API,支持基于SPARQL語言的查詢;
- 可使用Fuseki進行增刪查改。
1、背景
定義一個音樂知識圖譜的 Schema 如下:
- Schema中的藍(lán)線指向?qū)傩?#xff0c;綠線指向?qū)嶓w,虛線指向圖譜生成之后添加的屬性,后面通過 SPARQL Update 語句添加。
2、準(zhǔn)備工作
數(shù)據(jù)生成:
使用python腳本生成了1000個音樂知識圖譜的三元組:
數(shù)據(jù)導(dǎo)入:
- 使用TDB導(dǎo)入
使用tdbloader工具的命令為:/jena-fuseki/data 是存儲的位置。/jena-fuseki/tdbloader --loc=/jena-fuseki/data filename - 使用Fuseki導(dǎo)入
啟動Fuseki服務(wù):
在導(dǎo)入數(shù)據(jù)之后我們可以使用接口對我們的數(shù)據(jù)進行查詢,于是我們使用Fuseki Server進行查詢,啟動命令如下,注意此處需要指定TDB生成的文件路徑和數(shù)據(jù)庫名:其中 /music 是剛剛導(dǎo)入的數(shù)據(jù)
數(shù)據(jù)庫查詢方法:
- 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)查詢某一藝術(shù)家的所有歌曲
PREFIX music:<http://kg.course/music/>SELECT DISTINCT ?trackID WHERE {?trackID music:track_artist music:artist_01 }(2)查詢某一藝術(shù)家的所有歌曲的歌曲名
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)查詢某一首歌曲名的專輯信息,使用中文來當(dāng)變量名
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)對某個專輯里面的所有歌曲計數(shù)
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)查詢某一首歌是哪一個藝術(shù)家的作品
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)查詢某一藝術(shù)家唱過歌曲的所有標(biāo)簽
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)查詢某一藝術(shù)家唱過歌曲的所有類型并排序
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)查詢某幾類歌曲標(biāo)簽中的歌曲的數(shù)目
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、增加示例
給藝術(shù)家id新增屬性藝術(shù)家名字
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、刪除示例
刪除增加的屬性藝術(shù)家名字
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位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【知识图谱】知识存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【知识图谱】知识抽取与挖掘(Ⅱ)
- 下一篇: 【知识图谱】知识融合