多读书多实践,勤思考善领悟

从零开始学习知识图谱 之 十一.百科知识图谱构建 5.Jena使用及SPARQL查询

本文于1581天之前发表,文中内容可能已经过时。

一. 简介

Apache Jena是专门用于语义网本体操作的开源Java框架,其提供RDF和SPARQL API,来查询、修改本体和进行本体推理,并且提供了TDB和Fuseki来存储和管理三元组。

Fuseki是Jena提供的SPARQL服务器,也就是SPARQL endpoint。其提供了四种运行模式:单机运行、作为系统的一个服务运行、作为web应用运行或者作为一个嵌入式服务器运行。

本教程的项目代码放在github上,下载地址为《从零开始学习知识图谱》项目源代码

二. 环境准备

1. 操作系统

支持操作系统:windows、macOS、Linux。为了方便大家搭建开发环境,笔者尽可能在windows下构建,系列篇未特意说明时操作系统都是windows。Linux安装可以参考VirtualBox虚拟机安装UbuntuVirtualBox虚拟机安装CentOS8进行安装。

2. jdk

安装参见windows系统安装JDK

3. Apache jena

安装参见从零开始学习知识图谱 之 二

三. Jena 及 Fuseki 的使用

1. NTriples to TDB

TDB 是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。在下载完apache-jena后,进入 Jena 文件夹的 bin/,运行命令./tdbloader --loc="../tdb/" "path/to/NTriples"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS C:\my\apache-jena\bat> ./tdbloader --loc="..\tdb" "..\..\d2rq\hudong_fenlei.nt"
10:01:07 INFO loader :: -- Start triples data phase
10:01:07 INFO loader :: ** Load into triples table with existing data
10:01:07 INFO loader :: -- Start quads data phase
10:01:07 INFO loader :: ** Load empty quads table
10:01:07 INFO loader :: Load: ..\..\d2rq\hudong_fenlei.nt -- 2019/11/05 10:01:07 CST
10:01:09 INFO loader :: -- Finish triples data phase
10:01:09 INFO loader :: ** Data: 32,099 triples loaded in 2.13 seconds [Rate: 15,084.12 per second]
10:01:09 INFO loader :: -- Finish quads data phase
10:01:09 INFO loader :: -- Start triples index phase
10:01:09 INFO loader :: -- Finish triples index phase
10:01:09 INFO loader :: -- Finish triples load
10:01:09 INFO loader :: ** Completed: 32,099 triples loaded in 2.13 seconds [Rate: 15,034.66 per second]
10:01:09 INFO loader :: -- Finish quads load

将 NTriples 加载到TDB中。其中 –loc 指定 tdb的存储位置。第二个参数是我们通过d2rq等工具生成的nt文件。

2. Fuseki 服务的开启

进入 Fuseki 的文件夹,运行 fuseki-server 命令,会得到 run 文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\my\apache-jena-fuseki> ./fuseki-server --loc=..\apache-jena\tdb /kg_demo_hudong

[2019-11-05 10:10:19] Server INFO Running in read-only mode for /kg_demo_hudong
[2019-11-05 10:10:19] Server INFO Apache Jena Fuseki 3.13.0
[2019-11-05 10:10:20] Config INFO FUSEKI_HOME=C:\my\apache-jena-fuseki\.
[2019-11-05 10:10:20] Config INFO FUSEKI_BASE=C:\my\apache-jena-fuseki\run
[2019-11-05 10:10:20] Config INFO Shiro file: file://C:\my\apache-jena-fuseki\run\shiro.ini
[2019-11-05 10:10:20] Config INFO Template file: templates/config-tdb-dir
[2019-11-05 10:10:20] Config INFO TDB dataset: directory=..\apache-jena\tdb
[2019-11-05 10:10:21] Config INFO Load configuration: file:///C:/my/apache-jena-fuseki/run/configuration/fuseki_conf.ttl
[2019-11-05 10:10:21] Config INFO Register: /kg_demo_hudong
[2019-11-05 10:10:21] Server INFO Started 2019/11/05 10:10:21 CST on port 3030

在 run 文件夹下的 configuration 内创建 名为 fuseki_conf.ttl 的文本文件,写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@prefix :       <#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .

[] rdf:type fuseki:Server ;
fuseki:services (
<#service1>
) .

## ---------------------------------------------------------------
## Service with only SPARQL query on an inference model.
## Inference model base data in TDB.

<#service1> rdf:type fuseki:Service ;
fuseki:name "kg_demo_hudong" ;
fuseki:endpoint [ fuseki:operation fuseki:query; fuseki:name "sparql" ] ;
fuseki:endpoint [ fuseki:operation fuseki:query; fuseki:name "query" ] ;
fuseki:endpoint [ fuseki:operation fuseki:update; fuseki:name "update" ] ;
fuseki:endpoint [ fuseki:operation fuseki:upload; fuseki:name "upload" ] ;
fuseki:endpoint [ fuseki:operation fuseki:gsp_r; fuseki:name "get" ] ;
fuseki:endpoint [ fuseki:operation fuseki:gsp_rw; fuseki:name "data" ] ;
fuseki:dataset <#dataset> .

<#dataset> rdf:type tdb:DatasetTDB ;
ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "10000,30000" ] ;
tdb:location "../apache-jena/tdb" .

这里我们没有开启推理机,如想开启的话,需要提供本体文件。

再次运行 fuseki-server 开启服务,不需要添加运行参数./fuseki-server

1
2
3
4
5
6
7
8
9
10
11
PS C:\my\apache-jena-fuseki> ./fuseki-server

[2019-11-05 10:20:33] Server INFO Apache Jena Fuseki 3.13.0
[2019-11-05 10:20:34] Config INFO FUSEKI_HOME=C:\my\apache-jena-fuseki\.
[2019-11-05 10:20:34] Config INFO FUSEKI_BASE=C:\my\apache-jena-fuseki\run
[2019-11-05 10:20:34] Config INFO Shiro file: file://C:\my\apache-jena-fuseki\run\shiro.ini
[2019-11-05 10:20:34] Config INFO Configuration file: C:\my\apache-jena-fuseki\run\config.ttl
[2019-11-05 10:20:34] riot WARN [line: 5, col: 9 ] Bad IRI: <C:\my\apache-jena-fuseki\run\config.ttl#> Code: 4/UNWISE_CHARACTER in PATH: The character matches no grammar rules of URIs/IRIs. These characters are permitted in RDF URI References, XML system identifiers, and XML Schema anyURIs.
[2019-11-05 10:20:34] Config INFO Load configuration: file:///C:/my/apache-jena-fuseki/run/configuration/fuseki_conf.ttl
[2019-11-05 10:20:35] Config INFO Register: /kg_demo_hudong
[2019-11-05 10:20:35] Server INFO Started 2019/11/05 10:20:35 CST on port 3030

可以看到默认端口为 3030,因此在浏览器打开 http://localhost:3030 即可看到。

1
2
3
4
5
6
         Apache Jena Fuseki
Version 3.13.0. Uptime: 7m 02s

Datasets on this server
dataset name actions
/kg_demo_hudong

四. 简单 SPARQL 查询

进入页面后,点击query 按钮,进入查询页面。在下面样式的框中输入查询语句。

1
2
3
4
5
6
7
8
9
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://www.kghudong.com#>

SELECT ?subject ?predicate ?object
WHERE {
?subject ?predicate ?object
}
LIMIT 25

与Turtle类似,前面的三个 PREFIX 关键词指明各种URL的缩写,如 rdfs 表示 http://www.w3.org/2000/01/rdf-schema#, 什么都不加表示 http://www.kghudong.com#。其中 http://www.kghudong.com# 是要和你生成 nt文件时的那个 ttl 文件中的定义要对上,否则可能查询不到东西。

下面就是查询语句了,SELECT 关键词表明了哪些变量是感兴趣的。需要被匹配的图模式出现在WHERE关键词之后的括号中。返回的查询结果是一组被称作绑定(binding)的映射,表示了哪些元素对应到一个给定的变量,返回结果表格的每一行是一个结果或一个绑定。

在查询语句中,那些以 ? 开头的被称作变量。在上面的查询语句中,我们引入了三个变量 ?subject、?predicate、?object。将这三个变量携程三元组的形式就得到了一个图模式(Graph Pattern):

1
?subject ?predicate ?object

三元组存储库(这里就是Fuseki) 接收这个图模式,并尝试去找到能够匹配这个模式的那些三元组的集合。

点击查询框右上方的三角形即可运行这个查询语句,这里我们得到如下的查询结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
	subject	predicate	object
1
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_infobox>
"{}"
2
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_title>
"博焱"
3
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_relateLemma>
"{"\u6797\u4f2f\u5f66": "http://www.baike.com/wiki/%E6%9E%97%E4%BC%AF%E5%BD%A6?prd=zhengwenye_left_tongyici"}"
4
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_curLink>
"http://www.baike.com/wiki/%E6%9E%97%E4%BC%AF%E5%BD%A6"
5
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_interLink>
"{}"
6
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_title_id>
"1"^^xsd:integer
7
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_abstract>
"博焱,1987年8月27出生于台湾,中国台湾男演员,毕业于中国文化大学体育学系。2008年,出演首部电视剧《篮球火》,从而正式进入演艺圈 。2009年,主演台湾偶像剧《终极三国》,在剧中饰演张飞 。2010年,所在组合“武虎将”获得第十四届全球华语榜中榜暨亚洲影响力大典最佳新晋组合。2011年,出演台湾偶像剧《旋风管家》。2013年,出演台湾偶像剧《女王的诞生》 。2014年,出演清朝古装剧《龙飞凤舞》。编辑摘要 "
8
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_all_text>
" 演艺经历/博焱 编辑 博焱 2008年,出演首部电视剧《篮球火》,在剧中饰演齐啸云,从而正式进入演艺圈 。2009年,与胡宇威、陈德修、陈乃荣合作主演台湾偶像剧《终极三国》,在剧中饰演与关羽是出生入死的好朋友张飞 ;同年,与胡宇崴、班杰、邵翔、寺唯宏正组成“武虎将”,并推出《对手》、《朋友》两首单曲,收录于《强辩之〈终极三国〉三团鼎立SUPER大斗阵》合辑中 ;同年,武虎将推出首本写真集《我爱武虎将》 。2010年,与蔡颐榛、李昂霖、蔡芷纭合作主演魔法偶像剧《萌学园之萌骑士传奇》,在剧中饰演中等部-见习魔法士烈焱坚尼 ;同年,出演魔法偶像剧《萌学园2圣战再起》 ;3月28日,所在组合“武虎将”获得第十四届全球华语榜中榜暨亚洲影响力大典最佳新晋组合 。 博焱剧照 2011年,出演改编自日本漫画家畑健二郎的漫画作品《旋风管家!》的台湾偶像剧《旋风管家》,在剧中饰演康太郎的管家袁也枫。2013年,在台湾偶像剧《刺猬男孩》中饰演小蔡;同年,出演孙耀威、杨谨华、蔡淑臻主演的台湾偶像剧《女王的诞生》,在剧中饰演唐美宝的弟弟唐育成 。2014年,出演王建复、余秉谚、傅子纯、柯叔元主演的清朝古装剧《龙飞凤舞》,在剧中饰演春禾五霸之一的江水清。 主要作品/博焱 编辑 参演电视剧 上映时间 剧名 扮演角色 导演 合作演员 2014 龙飞凤舞 江水清 孙树培 王建复, 余秉谚 2013 女王的诞生 唐育成 陈戎晖 孙耀威, 杨谨华 2013 刺猬男孩 小蔡 王小棣 , 安哲毅 何以奇, 李佳颖 2011 旋风管家 袁也枫 朴信惠, 彭若仪 2010 爱似百汇 用餐的客人 辰亦儒 , 炎亚纶 2010 萌学园2圣战再起 烈焱坚尼 叶中强 李昂霖, 林奕勋, 阿本, 蔡芷纭, 蔡颐榛 2010 萌学园之萌骑士传奇 烈焱坚尼 叶中强 李昂霖, 林奕勋, 曾子余, 蔡芷纭, 蔡颐榛 2009 真情伴星月 利比亚留学生 黄克义 仇政, 贾孝国 2009 终极三国 张飞 潘静如, 黄家新, 冯家瑞 胡宇崴, 陈德修 2008 篮球火 齐啸云 林合隆, 杨利 吴尊, 言承旭, 罗志祥 音乐作品 专辑 专辑名称 发行时间 强辩之终极三国三国鼎立SUPER大斗阵 2009-03-04 国语 参演MV 年份 专辑名称 曲目 2009年   强辩之终极三国三国鼎立SUPER大斗阵 对手 - 武虎将、东城卫、强辩 2009年   Paradise 24小时疯狂 - 陈乃荣(武虎将客串) 出版书籍 年份 书名 出版社 2009-09-11   我爱武虎将 台湾角川 获奖记录/博焱 编辑 全球华语榜中榜 ▪ 2010-03-28 第十四届 全球华语榜中榜暨亚洲影响力大典最佳新晋组合 (获奖) 人物评价/博焱 编辑 博焱是一个NG大王,他在拍《终极三国》时NG掉好几饼带子,作为新人拍戏经验不是很足,进入状态很慢 (网易评) 。博焱主演的魔法偶像剧《萌学园》深受大小朋友的喜爱 (ETtoday评) 。博焱是一位体型精力都一级棒的帅哥,他不仅身材完美,武艺也很高超 (腾讯评) 。 "
9
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_exterLink>
"{}"
10
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_disambi>
"博焱"
11
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_redirect>
"林伯彦"
12
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_subject>
"人物,名人,明星,歌手,演员,综艺"
13
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
rdfs:label
"lemmas #1"
14
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
<http://www.kgdemo.com#lemmas_interPic>
"http://a3.att.hudong.com/57/28/50200009239445155794289843634_s.jpg,http://www.huimg.cn/public/images/a-baikelogo2.gif,http://www.huimg.cn/lib/0.gif,http://www.huimg.cn/lib/0.gif,http://a3.att.hudong.com/57/28/50200009239445155794289843634_s.jpg,//www.huimg.cn/public/images/a-baikelogo2.gif,//a7.baike.com/46/56/4656D0B2C95947F0E226C489FE26466F_90.png?title=%E5%8D%9A%E7%84%B1"
15
<file:///C:/my/d2rq/hudong_fenlei.nt#lemmas/1>
rdf:type
<http://www.kgdemo.com#lemmas>
16
<http://www.kgdemo.com#lemmas_infobox>
rdfs:label
"lemmas infobox"
17
<http://www.kgdemo.com#lemmas_infobox>
rdf:type
rdf:Property
18
<http://www.kgdemo.com#lemmas_title>
rdfs:label
"lemmas title"
19
<http://www.kgdemo.com#lemmas_title>
rdf:type
rdf:Property
20
<http://www.kgdemo.com#lemmas_relateLemma>
rdfs:label
"lemmas relateLemma"
21
<http://www.kgdemo.com#lemmas_relateLemma>
rdf:type
rdf:Property
22
<http://www.kgdemo.com#lemmas_curLink>
rdfs:label
"lemmas curLink"
23
<http://www.kgdemo.com#lemmas_curLink>
rdf:type
rdf:Property
24
<http://www.kgdemo.com#lemmas_interLink>
rdfs:label
"lemmas interLink"
25
<http://www.kgdemo.com#lemmas_interLink>
rdf:type
rdf:Property

SPARQL的全部寄出就是这个简单的概念:尝试去找到能够匹配一个给定的图模式的那些三元组的集合。SPARQL提供了更多的功能,用来指定更加复杂的模式并以不同的方式提供结果。但无论模式多么复杂,运用的过程都是一样的。