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

从零开始学习知识图谱 之 二.电影知识图谱构建 2.结构化数据到RDF以及基于Apache jena交互

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

一. 简介

结构化数据到RDF由两种主要方式,一个是通过direct mapping,另一个通过R2RML语言这种,基于R2RML语言的方式更为灵活,定制性强。对于R2RML有一些好用的工具,此处我们使用d2rq工具,它基于R2RML-KIT。关于这两步,SimmerChan的专栏实践篇(一):数据准备和本体建模已经介绍的很详细,此处我把针对本项目的细节和代码交代一下。

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

二. 环境准备

1. 操作系统

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

2. jdk

安装参见windows系统安装JDK

3. Protege

斯坦福大学开发的本体编辑和知识获取软件。开发语言采用Java,属于开放源码软件。由于其优秀的设计和众多的插件,Protege已成为目前使用最广泛的本体论编辑器之一。软件不需要安装,需要配置相应的Java环境。

打开protege,看到和下图类似的界面。在Ontology IRI中填写我们新建本体资源的IRI。读者可以填写自己的符合标准的IRI。如下:

1
http://www.kgdemo.com

4. d2rq

D2RQ平台用于访问关系数据库系统是虚拟的,只读RDF图。它提供了基于RDF的访问关系数据库的内容,而无需复制成RDF存储。使用D2RQ可参考文章使用d2rq的第一步官方文档

官方网站:http://d2rq.org/

a. 下载后得到了d2rq-0.8.1.zip的压缩文件,d2rq不需要安装,直接将其解压到运行目录,再配置运行环境即可。

b. 项目需要将d2rq与java、mysql进行联合应用,因此需要JDBC driver,将mysql-connector-java-5.1.48-bin.jar文件放入d2rq的/lib文件夹中。

5. Apache jena

Apache Jena是一个开源的Java语义网框架(open source Semantic Web Framework for Java),用于构建语义网和链接数据应用。安装可阅读文章Jena 和 Fuseki安装与SPARQL查询

下载地址:http://jena.apache.org/download/

TDB:用于存储RDF的组件。
Jena:提供了RDFS、OWL和通用规则推理机。下载Jena
Fuseki:Jena提供的SPARQL服务器,也就是SPARQL endpoint。下载Fuseki

Apache Jena,java开发的软件免安装。

三. 项目构建

1. Direct mapping

本质上是通过编写启发式规则将数据库中的表转换为RDF三元组。其对应规则如下:

  • table to class
  • cloumn to property
  • row to resource
  • cell to literal value
  • in addition cell to URI
  • if there is a forgin key constraint

也就是把表结构映射到对应的三元组中。对应于我们的数据库,可以编写规则得到如下映射结果:

1
2
3
4
5
6
7
@base <http://movie.baidubaike/DB/> .
@prefix xsd:<http://www.w3.org/2001/XMLSchema#> .
<actor/actor_id=1> rdf:type <actor> .
<actor/actor_id=1> <actor#actor_id> 1 . <actor/actor_id=1> <actor#actor_chName> "周星驰" . <actor/actor_id=1> <actor#actor_bio> "周星驰是。。。" <actor/actor_id=1> <actor#actor_repWorks> "赌圣" . <actor/actor_id=1> <actor#ref-movie> <movie/movie_id=1> . ...."其他属性"

<movie/movie_id=1> rdf:type <movie> .
<movie/movie_id=1> <movie#movie_id> 1. <movie/movie_id=1> <movie#movie_chName> "赌圣" . ...

2. D2RQ

The D2RQ Platform is a system for accessing relational databases as virtual, read-only RDF graphs. It offers RDF-based access to the content of relational databases without having to replicate it into an RDF store. Using D2RQ you can:

  • query a non-RDF database using SPARQL
  • Zccess the content of the database as Linked Data over the Web
  • create custom dumps of the database in RDF formats for loading into an RDF store
  • access information in a non-RDF database using the Apache Jena API

上面是官方对D2RQ的介绍,可以看到它的主要功能是提供以虚拟的、只读的RDF图形式进入到关系型数据库中。也就是说比如你通过SPARQL端口查询,输入是SPARQL查询语言,D2RQ通过mapping文件将其转换为SQL语句在关系数据库上查询,因此实际上访问的是关系型数据库。

D2RQ 由自己的mapping语言,R2RML-kit。它和W3C推荐的R2RML类似。你可以通过D2RQ提供的工具来根据数据库自动生成mapping文件。你可以根据自己的需求去修改定制自己的mapping文件。

用generate-mapping工具为数据库创建mapping file(映射文件)。cmd中运行 cd C:\my\d2rq命令,转到d2rq目录。

1). 运行以下命令,创建mappling映射文件。

?useSSL=false语句设置SSL为false以避免提示警告,数据库没设置主键会提示警告。

1
2
3
PS C:\my\d2rq> ./generate-mapping -u root -p root -o kg_demo_mapping_baidu_baike.ttl jdbc:mysql:///baidu_baike?useSSL=false
## -u 后root是数据库用户,-p 后root是用户密码,jdbc:mysql: 后baidu_baike是数据库名称;
## 注意笔者是Windows PowerShell命令窗口运行命令,若在cmd中去掉前面的./,即:generate-mapping开始。下面的命令也如此。

下面是根据我们定义的本体修改的mapping文件。

a. 为了表达简练,我们给本体做一些修改。

这样http://www.kgdemo.com#Actor就可以表达为:Actor,其他的词汇同理。

vocab前缀,它表示输出本体的命名空间,也就是说,所有来自D2RQRDF都必须使用具有vocab前缀的命名空间的类和属性描述。这样做的目的是为了使它们是唯一的,在需要读取某个类或属性时可以直接操作,而不必先动态获得命名空间了。

b. 把默认的映射词汇改为我们本体中的词汇即可。在处理外键的时候要注意当前编辑的属性的domain和range,belongsToClassMap是domain,refersToClassMap是range。

为了实现生成及修改全自自动,需编写dos下的bat实现,get_ttl.bat代码如下:

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
@echo off&setlocal enabledelayedexpansion

set db=baidu_baike
set file=kg_demo_mapping_%db%.ttl

call generate-mapping -u root -p root -o %file% jdbc:mysql:///%db%?useSSL=false

:: call findstr /i /v /C:"@prefix vocab" "%file%">>%file%.bk
:: move /y %file%.bk %file%

for /f "tokens=1,* delims=:" %%b in ('findstr /n ".*" "%file%"')do (
set "var=%%c"
if "!var!" neq "@prefix vocab: <vocab/> ." (
if "!var!" equ "" (
>>%file%.bk echo,!var!) ^
else if "!var!" equ "@prefix jdbc: <http://d2rq.org/terms/jdbc/> ." (
>>%file%.bk echo,!var!
>>%file%.bk echo,@prefix : ^<http://www.kgdemo.com#^> .) ^
else (
echo;"!var!"|find "jdbcDSN"&&(
>>%file%.bk echo, d2rq:jdbcDSN ^"jdbc:mysql:///%db%?useUnicode=true^&characterEncoding=utf8^&useSSL=false^";)||(
set "var=!var:vocab= !"
set "var=!var:actor_actor=actor!"
>>%file%.bk echo,!var!))
)
)
move /y %file%.bk %file%

然后手动修改生成的文件

1
2
3
4
5
# Table actor_to_movie (n:m)
map:actor_to_movie__link a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:actor; #改前为map:movie
d2rq:property :hasActedIn;
d2rq:refersToClassMap map:movie; #改前为map:actor

根据默认生成的ttl文件被保存到百度云上,您可以下载后查阅,百度百科mapping 文件(提取码:m9n9)、互动百科 mapping 文件(提取码:jbyp)。

2). 运行dump-rdf工具,创建rdf的转存,命令将数据转换为Ntriples

在生成mapping文件后,您可以通过:./dump-rdf -o baidu_baike.nt kg_demo_mapping_baidu_baike.ttl; 命令将数据转换为Ntriples。

按照官方的介绍,运行以下命令生成rdf,在d2rq文件夹中查看生成的nt文件可以看到RDF结构。

1
PS C:\my\d2rq> ./dump-rdf -o baidu_baike.nt kg_demo_mapping_baidu_baike.ttl

3). 使用下面的命令启动D2R Server

1
2
PS C:\my\d2rq> ./d2r-server kg_demo_mapping_baidu_baike.ttl
17:10:16 INFO JettyLauncher :: [[[ Server started at http://localhost:2020/ ]]]

4). SPARQL查询

例如:“周星驰出演了哪些电影?”

1
2
3
4
5
6
SELECT ?n WHERE {
?s rdf:type :Actor.
?s :actor_chName '周星驰'.
?o :movie_chName ?n
}
LIMIT 10

结果为:

1
2
3
4
5
6
7
8
9
10
11
12
SPARQL results:
n
"七小福"
"大众电影百花奖"
"台湾电影金马奖"
"香港电影金像奖"
"香港电影导演会"
"长江7号"
"第28届香港电影金像奖"
"跳出去"
"少林少女"
"西游:降魔篇"

就我们这个例子而言,可以不要“?s rdf:type :Actor”,这里只是让查询图更具体(在拥有复杂关系的RDF图中,可能会存在不同的类拥有相同的属性名。比如,猫和狗名字的属性名都是”name”,我们想查询一只叫汤姆的猫;如果不指定类型,返回结果可能也包含一只叫汤姆的狗)。图模式中,每个RDF用英文句号进行分割。

例如:“少林足球这部电影有哪些演员参演”:

1
2
3
4
5
6
SELECT ?n WHERE {
?s rdf:type :Movie.
?s :movie_chName '少林足球'.
?a :hasActedIn ?s.
?a :actor_chName ?n
}

结果为:

1
2
3
n
"周星驰"
"吴孟达"

文件存放在百度云盘中,百度百科(提取码:haqq)、互动百科(提取码:cipw)。

3. Apache jena

  • NTriples to TDB

TDB 是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。在下载完apache-jena后,运行 ./tdbloader –loc=”../tdb/” “path/to/NTriples” 把 NTriples 加载到TDB中。

  • Apache jena fuseki 的运行

在Apache Jena fuseki服务器的配置文件中,可以指定本体,从而实现推理机制。该本体文件是从顶向下定义的,采用protege软件编辑生成,格式为Turtle,放在struct_to_rdf/kg_movie_tultle.owl。该配置文件中另一个需要修改的是TDB文件夹的路径,改成上面TDB 文件夹路径即可。

需要注意的是,每次运行fuseki服务器后,会在TDB文件夹内生成一些以prefix*开头的文件,重新运行fuseki服务的话不删除它们可能会报错。

  • Apache jena SPARQL endpoint

Jena fuseki开启服务后,可以通过网页端和命令行方式进行SPQRQL查询。接下来我们可以直接进行SPARQL查询,也可以把自然语言转换为 SPARQL 模板后进行查询。

操作步骤

1). 将RDF数据转换以TDB的方式存储

运行命令:tdbloader –loc=”..\tdb” “....\d2rq\baidu_baike.nt”

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
PS C:\my\apache-jena\bat> ./tdbloader --loc="..\tdb" "..\..\d2rq\baidu_baike.nt"
16:03:28 INFO loader :: -- Start triples data phase
16:03:28 INFO loader :: ** Load empty triples table
16:03:28 INFO loader :: -- Start quads data phase
16:03:28 INFO loader :: ** Load empty quads table
16:03:28 INFO loader :: Load: ..\..\d2rq\baidu_baike.nt -- 2019/09/27 16:03:28 CST
16:03:30 INFO loader :: Add: 50,000 triples (Batch: 31,867 / Avg: 31,867)
16:03:30 INFO loader :: Add: 100,000 triples (Batch: 124,688 / Avg: 50,761)
16:03:31 INFO loader :: Add: 150,000 triples (Batch: 147,928 / Avg: 64,991)
16:03:31 INFO loader :: Add: 200,000 triples (Batch: 124,378 / Avg: 73,800)
16:03:31 INFO loader :: Add: 250,000 triples (Batch: 128,534 / Avg: 80,671)
16:03:32 INFO loader :: Add: 300,000 triples (Batch: 152,905 / Avg: 87,565)
16:03:32 INFO loader :: Add: 350,000 triples (Batch: 131,926 / Avg: 91,984)
16:03:32 INFO loader :: Add: 400,000 triples (Batch: 135,501 / Avg: 95,831)
16:03:33 INFO loader :: Add: 450,000 triples (Batch: 154,798 / Avg: 100,066)
16:03:33 INFO loader :: Add: 500,000 triples (Batch: 145,348 / Avg: 103,284)
16:03:33 INFO loader :: Elapsed: 4.84 seconds [2019/09/27 16:03:33 CST]
16:03:33 INFO loader :: Add: 550,000 triples (Batch: 160,256 / Avg: 106,733)
16:03:34 INFO loader :: Add: 600,000 triples (Batch: 145,348 / Avg: 109,150)
16:03:34 INFO loader :: Add: 650,000 triples (Batch: 125,628 / Avg: 110,262)
16:03:34 INFO loader :: -- Finish triples data phase
16:03:34 INFO loader :: ** Data: 663,080 triples loaded in 6.08 seconds [Rate: 109,059.21 per second]
16:03:34 INFO loader :: -- Finish quads data phase
16:03:34 INFO loader :: -- Start triples index phase
16:03:35 INFO loader :: Index SPO->POS: 100,000 slots (Batch: 418,410 slots/s / Avg: 418,410 slots/s)
16:03:35 INFO loader :: Index SPO->POS: 200,000 slots (Batch: 662,251 slots/s / Avg: 512,820 slots/s)
16:03:35 INFO loader :: Index SPO->POS: 300,000 slots (Batch: 598,802 slots/s / Avg: 538,599 slots/s)
16:03:35 INFO loader :: Index SPO->POS: 400,000 slots (Batch: 588,235 slots/s / Avg: 550,206 slots/s)
16:03:35 INFO loader :: Index SPO->POS: 500,000 slots (Batch: 581,395 slots/s / Avg: 556,173 slots/s)
16:03:35 INFO loader :: Index SPO->POS: 600,000 slots (Batch: 598,802 slots/s / Avg: 562,851 slots/s)
16:03:36 INFO loader :: ** Index SPO->POS: 663,080 slots indexed in 1.19 seconds [Rate: 558,618.38 per second]
16:03:36 INFO loader :: Index SPO->OSP: 100,000 slots (Batch: 657,894 slots/s / Avg: 657,894 slots/s)
16:03:36 INFO loader :: Index SPO->OSP: 200,000 slots (Batch: 694,444 slots/s / Avg: 675,675 slots/s)
16:03:36 INFO loader :: Index SPO->OSP: 300,000 slots (Batch: 584,795 slots/s / Avg: 642,398 slots/s)
16:03:36 INFO loader :: Index SPO->OSP: 400,000 slots (Batch: 561,797 slots/s / Avg: 620,155 slots/s)
16:03:36 INFO loader :: Index SPO->OSP: 500,000 slots (Batch: 595,238 slots/s / Avg: 615,006 slots/s)
16:03:37 INFO loader :: Index SPO->OSP: 600,000 slots (Batch: 546,448 slots/s / Avg: 602,409 slots/s)
16:03:37 INFO loader :: ** Index SPO->OSP: 663,080 slots indexed in 1.11 seconds [Rate: 595,224.44 per second]
16:03:37 INFO loader :: -- Finish triples index phase
16:03:37 INFO loader :: ** 663,080 triples indexed in 2.31 seconds [Rate: 287,171.94 per second]
16:03:37 INFO loader :: -- Finish triples load
16:03:37 INFO loader :: ** Completed: 663,080 triples loaded in 8.41 seconds [Rate: 78,844.23 per second]
16:03:37 INFO loader :: -- Finish quads load

注意:“–loc”指定tdb存储的位置;第二个参数是由Mysql数据转换得到的RDF数据。

2). 通过Fuseki进行开启服务

进入fuseki目录下,运行命令:fuseki-server –loc=..\apache-jena\tdb /kg_movie

注意:–loc的参数是上一步TDB数据库的路径,kg_movie是显示的数据库名。

1
2
3
4
5
6
7
8
9
10
PS C:\my\apache-jena-fuseki> ./fuseki-server --loc=..\apache-jena\tdb /kg_movie
[2019-09-25 16:35:32] Server INFO Running in read-only mode for /kg_movie
[2019-09-25 16:35:32] Server INFO Apache Jena Fuseki 3.12.0
[2019-09-25 16:35:32] Config INFO FUSEKI_HOME=C:\my\apache-jena-fuseki\.
[2019-09-25 16:35:32] Config INFO FUSEKI_BASE=C:\my\apache-jena-fuseki\run
[2019-09-25 16:35:32] Config INFO Shiro file: file://C:\my\apache-jena-fuseki\run\shiro.ini
[2019-09-25 16:35:32] Config INFO Template file: templates/config-tdb-dir
[2019-09-25 16:35:32] Config INFO TDB dataset: directory=..\apache-jena\tdb
[2019-09-25 16:35:33] Config INFO Register: /kg_movie
[2019-09-25 16:35:33] Server INFO Started 2019/09/25 16:35:33 CST on port 3030

启动后,Fuseki网站地址: http://localhost:3030/

测试查询,可以通过网页端和命令行方式进行SPQRQL查询

如:过滤出变量包含“长江7号”的实体

1
2
3
4
5
6
SELECT ?subject ?predicate ?object
WHERE {
?subject ?predicate ?object
FILTER regex(?object, "长江7号")
}
LIMIT 25

返回结果:

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
	subject	predicate	object
1
<file:///C:/my/d2rq/baidu_baike.nt#movie/6>
<http://www.kgdemo.com#movie_chName>
"长江7号"
2
<file:///C:/my/d2rq/baidu_baike.nt#movie/6>
<http://www.kgdemo.com#movie_bio>
" 《长江7号》是由周星驰执导,周星驰、徐娇、张雨绮、林子聪主演的科幻喜剧电影。该片于2008年1月30日在中国上映。影片讲述一名父亲将意外拾获的外星玩具狗当做礼物送给儿子,从而让父子两人的生活发生变化的故事。 [1] "
3
<file:///C:/my/d2rq/baidu_baike.nt#movie/10221>
<http://www.kgdemo.com#movie_chName>
"长江7号爱地球"
4
<file:///C:/my/d2rq/baidu_baike.nt#movie/10221>
<http://www.kgdemo.com#movie_bio>
" 《长江7号爱地球》是由袁建滔执导的动画电影,石班瑜、徐娇、董洁等联合配音。该片于2010年7月9日在中国内地上映。该片讲述了狄爸以在建筑工地打散工养家,在垃圾堆意外捡到神秘外星生物7仔的故事。 [1] "
5
<file:///C:/my/d2rq/baidu_baike.nt#actor/1>
<http://www.kgdemo.com#actor_bio>
" 周星驰,1962年6月22日生于香港,祖籍浙江宁波,中国香港演员、导演、编剧、制作人、商人,毕业于无线电视艺员训练班。1980年成为丽的电视台的特约演员,从而进入演艺圈。1981年出演个人首部电视剧《IQ成熟时》。1988年将演艺事业的重心转向大银幕,并于同年出演电影处女作《捕风汉子》。1990年凭借喜剧片《一本漫画闯天涯》确立其无厘头的表演风格 [1] ;同年,因其主演的喜剧动作片《赌圣》打破香港地区票房纪录而获得关注 [2] 。1991年主演喜剧片《逃学威龙》,并再次打破香港地区票房纪录 [3] 。1995年凭借喜剧爱情片《大话西游》奠定其在华语影坛的地位。1999年自导自演的喜剧片《喜剧之王》获得香港电影年度票房冠军 [4] 。2002年凭借喜剧片《少林足球》获得第21届香港电影金像奖最佳男主角奖以及最佳导演奖 [5] 。2003年成为美国《时代周刊》封面人物 [6] 。2005年凭借喜剧动作片《功夫》获得第42届台湾电影金马奖最佳导演奖 [7] 。2008年自导自演的科幻喜剧片《长江7号》获得香港电影年度票房冠军 [8] 。2013年执导古装喜剧片《西游·降魔篇》,该片以2.18亿美元的票房成绩打破华语电影在全球的票房纪录 [9-10] 。2016年担任科幻喜剧片《美人鱼》的导演、编剧、制作人,该片以超过33亿元的票房创下中国内地电影票房纪录 [11-14] 。2017年1月28日,担任监制、编剧的古装喜剧片《西游伏妖篇》上映 [15] 。2018年执导《美人鱼2》 [16] 。演艺事业外,周星驰还涉足商界。1989年成立星炜有限公司 [17] 。1996年成立星辉公司 [18] 。2010年出任比高集团有限公司执行董事 [19] 。 "
6
<file:///C:/my/d2rq/baidu_baike.nt#movie/10218>
<http://www.kgdemo.com#movie_bio>
" 曾谨昌是香港资深编剧家。他于1981年加入电视广播有限公司(TVB),编写过多部脍炙人口的电视剧,作品有《白蛇传说》、《长江7号爱地球》等。 "

3). 实现OWL推理

上一步运行完退出。程序会为我们在当前目录自动创建“run”文件夹实现。将我们的本体文件“kg_movie_tultle.owl”移动到“run”文件夹下的“databases”文件夹中,并将“owl”后缀名改为“ttl”。在“run”文件夹下的“configuration”中,我们创建名为“fuseki_conf.ttl”的文本文件(取名没有要求),加入如下内容:

1) TDB

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_movie" ;
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" .

2) 在内存,同步加载本体和三元组

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
@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_movie" ;
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 ja:RDFDataset ;
ja:defaultGraph
[ a ja:MemoryModel ;
ja:content [ja:externalContent <file:../databases/kg_movie_tultle.ttl> ] ;
ja:content [ja:externalContent <file:../../../d2rq/baidu_baike.nt> ] ;
] ;
.

再次运行“fuseki-server.bat”,如果出现如下界面表示运行成功:

1
2
3
4
5
6
7
8
9
10
PS C:\my\apache-jena-fuseki> ./fuseki-server
[2019-09-26 10:48:42] Server INFO Apache Jena Fuseki 3.12.0
[2019-09-26 10:48:42] Config INFO FUSEKI_HOME=C:\my\apache-jena-fuseki\.
[2019-09-26 10:48:42] Config INFO FUSEKI_BASE=C:\my\apache-jena-fuseki\run
[2019-09-26 10:48:42] Config INFO Shiro file: file://C:\my\apache-jena-fuseki\run\shiro.ini
[2019-09-26 10:48:42] Config INFO Configuration file: C:\my\apache-jena-fuseki\run\config.ttl
[2019-09-26 10:48:42] 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-09-26 10:48:43] Config INFO Load configuration: file:///C:/my/apache-jena-fuseki/run/configuration/fuseki_conf.ttl
[2019-09-26 10:48:43] Config INFO Register: /kg_movie
[2019-09-26 10:48:43] Server INFO Started 2019/09/26 10:48:43 CST on port 3030

需要注意的是,每次运行fuseki服务器后,会在TDB文件夹内生成一些以prefix*开头的文件,重新运行fuseki服务的话不删除它们可能会报错。

测试查询,可以通过网页端和命令行方式进行SPQRQL查询,经过实践,发现丧失推理能力。

如:查询电影鹿鼎记的所有属性

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

SELECT * WHERE {
?x :movie_chName '鹿鼎记'.
?x ?p ?o.
}

返回的结果:

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

x p o
1
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
rdfs:label
"movie #35"
2
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
rdf:type
:Movie
3
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_language
"粤语"
4
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_screenwriter
"王晶"
5
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_rekeaseTime
"1992年07月30日"
6
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_prodTime
"None"
7
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_id
"35"^^xsd:integer
8
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_foreName
"Royal Tramp"
9
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_genre
"动作"
10
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_star
"周星驰,温兆伦,邱淑贞,张敏,吴孟达,徐锦江"
11
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_achiem
"None"
12
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_chName
"鹿鼎记"
13
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_director
"王晶"
14
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_prodCompany
"香港永盛电影公司"
15
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_bio
" 《鹿鼎记》是改编自金庸小说的一部武侠喜剧。影片由王晶执导,周星驰、吴孟达、温兆伦、林青霞 、 李嘉欣、袁洁莹、邱淑贞、陈德容等联合出演。影片讲述清朝初期,康熙皇帝年少,奸臣鳌拜从中控制政权。韦小宝有幸加入推翻清朝的民间组织“天地会”,被派到王宫当卧底,偷取藏有清朝秘密的四十二章经。韦小宝很快成为皇上的心腹,做了大官。他既要执行任务却又跟皇帝成为了好朋友,陷入了两难的状态。 [1] 该片于1992年7月30日上映。 "
16
<file:///C:/my/d2rq/baidu_baike.nt#movie/35>
:movie_length
"106 分钟"

4. 本体建模

为了能够让Jena在我们的本体上进行推理,需要提供自定义的本体文件。本项目的本体通过protege 生成,详细流程请查看SimmerChan的专栏实践篇(一):数据准备和本体建模。根据上述流程生成的针对本项目的本体文件为struct_to_rdf/movie_actor/kg_movie_tultle.owl。