文章首发于博客du_ok’s Notes,本文链接为知识图谱入门——知识存储
本文首对一些开源数据库(如RDF4J、gStore),商业数据库(如Virtuoso、AllegroGraph和Stardog),以及一些原生的图数据库(如Neo4j、OrientDB和Titan)进行了粗略的介绍;接着介绍了一个使用Apache Jena数据库的例子。
图数据库源起欧拉和图理论 (graph theory),也可称为面向/基于图的数据库,对应的英文是Graph Database。图数据库的基本含义是以“图”这种数据结构存储和查询数据。它的数据模型主要是以节点和关系 (边)来体现,也可处理键值对。它的优点是快速解决复杂的关系问题。
图具有如下特征:
参见百度百科:Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
Neo4j数据导入:
**Neo4j查询数据:**使用Cypher查询语言(基于遍历)
OrientDB是一个用Java实现的开源NoSQL数据库管理系统。它是一个多模式的数据库,支持图形、文档、键值对、对象模型和关系,也可以为图数据库的管理与记录之间的提供连接。
Jena是一个免费开源的支持构建语义网络和数据链接应用的Java框架。
Schema中的蓝线指向属性,绿线指向实体,虚线指向图谱生成之后添加的属性,后面通过
SPARQL Update语句添加。
我们使用python脚本生成了1000个音乐知识图谱的三元组:
数据导入:
/jena-fuseki/tdbloader --loc=/jena-fuseki/data filename
'/jena-fuseki/data’是存储的位置。
启动Fuseki服务:
在导入数据之后我们可以使用接口对我们的数据进行查询,于是我们使用Fuseki Server进行查询,启动命令如下,注意此处需要指定TDB生成的文件路径和数据库名:
/jena-fuseki/fuseki-server --loc=/jena-fuseki/data --update /music
其中/music是刚刚导入的数据
数据库查询方法:
后两种方法都是可以基于Python语言。
PREFIX music:
SELECT DISTINCT ?trackID
WHERE {
?trackID music:track_artist music:artist_01
}
PREFIX music:
SELECT ?name
WHERE {
?trackID music:track_artist music:artist_01 .
?trackID music:track_name ?name
}
PREFIX music: <http://kg.course/music/>
SELECT ?trackID ?ablumID ?name
WHERE {
?trackID music:track_name "track_name_00001" .
?trackID music:track_album ?ablumID .
?ablumID music:ablum_name ?name
}
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 ?专辑名
}
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 ?专辑名
}
PREFIX music: <http://kg.course/music/>
SELECT ?trackID
WHERE {
?albumID music:album_name "album_name_0002" .
?trackID music:track_album ?albumID
}
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
PREFIX music: <http://kg.course/music/>
SELECT (COUNT(?trackID) as ?num)
WHERE {
?albumID music:album_name "album_name_0002" .
?trackID music:track_album ?albumID
}
PREFIX music: <http://kg.course/music/>
SELECT ?trackID ?artistID
WHERE {
?trackID music:track_name "track_name_00001" .
?trackID music:track_artist ?artistID
}
PREFIX music: <http://kg.course/music/>
SELECT ?trackID ?tag_name
WHERE {
?trackID music:track_name "track_name_00001" .
?trackID music:track_tag ?tag_name
}
PREFIX music: <http://kg.course/music/>
SELECT DISTINCT ?tag_name
WHERE {
?trackID music:track_artist music:artist_001 .
?trackID music:track_tag ?tag_name
}
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
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_name
FILTER (?tag_name = "tag_name_01"|| ?tag_name = "tag_name_02")
}
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")
}
PREFIX music: <http://kg.course/music/>
ASK
{
?trackID music:track_name ?track_name .
FILTER regex(?track_name,"008")
}
给艺术家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
}
删除增加的属性艺术家名字
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
}