日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【知识图谱】知识存储

發布時間:2025/3/19 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【知识图谱】知识存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、圖數據庫
    • 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(廣義上的原生數據庫)

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 是剛剛導入的數據

/jena-fuseki/fuseki-server --loc=/jena-fuseki/data --update /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年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【知识图谱】知识存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。