一. 简介 结构化数据到RDF由两种主要方式,一个是通过direct mapping,另一个通过R2RML语言这种,基于R2RML语言的方式更为灵活,定制性强。对于R2RML有一些好用的工具,此处我们使用d2rq工具,它基于R2RML-KIT。关于这两步,SimmerChan的专栏实践篇(一):数据准备和本体建模 已经介绍的很详细,此处我把针对本项目的细节和代码交代一下。
本教程的项目代码放在github上,下载地址为《从零开始学习知识图谱》项目源代码 。
二. 环境准备 1. 操作系统 支持操作系统:windows、macOS、Linux。为了方便大家搭建开发环境,笔者尽可能在windows下构建,系列篇未特意说明时操作系统都是windows 。Linux安装可以参考VirtualBox虚拟机安装Ubuntu 或VirtualBox虚拟机安装CentOS8 进行安装。
2. jdk 安装参见windows系统安装JDK
3. Protege 斯坦福大学开发的本体编辑和知识获取软件。开发语言采用Java,属于开放源码软件。由于其优秀的设计和众多的插件,Protege 已成为目前使用最广泛的本体论编辑器之一。软件不需要安装,需要配置相应的Java环境。
打开protege,看到和下图类似的界面。在Ontology IRI中填写我们新建本体资源的IRI。读者可以填写自己的符合标准的IRI。如下:
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: ## -u 后root是数据库用户,-p 后root是用户密码,jdbc:mysql: 后baidu_baike是数据库名称; ## 注意笔者是Windows PowerShell命令窗口运行命令,若在cmd中去掉前面的./,即:generate -mapping开始。下面的命令也如此。
下面是根据我们定义的本体修改的mapping文件。
a. 为了表达简练,我们给本体做一些修改。
这样http://www.kgdemo.com#Actor就可以表达为
:Actor,其他的词汇同理。
vocab 前缀,它表示输出本体的命名空间,也就是说,所有来自D2RQ 的RDF 都必须使用具有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_baikeset file=kg_demo_mapping_%db% .ttlcall 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 }
结果为:
文件存放在百度云盘中,百度百科 (提取码:haqq)、互动百科 (提取码:cipw)。
3. Apache jena
TDB 是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。在下载完apache-jena后,运行 ./tdbloader –loc=”../tdb/” “path/to/NTriples” 把 NTriples 加载到TDB中。
在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 phase16 :03 :28 INFO loader : : ** Load empty triples table16 :03 :28 INFO loader : : -- Start quads data phase16 :03 :28 INFO loader : : ** Load empty quads table16 :03 :28 INFO loader : : Load: ..\..\d2rq\baidu_baike.nt -- 2019 /09/ 27 16 :03 :28 CST16 :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 phase16 :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 phase16 :03 :34 INFO loader : : -- Start triples index phase16 :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 phase16 :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 load16 :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 <http:// www.kgdemo.com "长江7号" 2 <file:// /C:/my /d2rq/ baidu_baike.nt <http:// www.kgdemo.com " 《长江7号》是由周星驰执导,周星驰、徐娇、张雨绮、林子聪主演的科幻喜剧电影。该片于2008年1月30日在中国上映。影片讲述一名父亲将意外拾获的外星玩具狗当做礼物送给儿子,从而让父子两人的生活发生变化的故事。 [1] " 3 <file:// /C:/my /d2rq/ baidu_baike.nt <http:// www.kgdemo.com "长江7号爱地球" 4 <file:// /C:/my /d2rq/ baidu_baike.nt <http:// www.kgdemo.com " 《长江7号爱地球》是由袁建滔执导的动画电影,石班瑜、徐娇、董洁等联合配音。该片于2010年7月9日在中国内地上映。该片讲述了狄爸以在建筑工地打散工养家,在垃圾堆意外捡到神秘外星生物7仔的故事。 [1] " 5 <file:// /C:/my /d2rq/ baidu_baike.nt <http:// www.kgdemo.com " 周星驰,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 <http:// www.kgdemo.com " 曾谨昌是香港资深编剧家。他于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> ) . <#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> ) . <#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:\m y\a pache-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:\m y\a pache-jena-fuseki\. [2019-09-26 10:48:42] Config INFO FUSEKI_BASE=C:\m y\a pache-jena-fuseki\r un [2019-09-26 10:48:42] Config INFO Shiro file: file://C:\m y\a pache-jena-fuseki\r un\s hiro.ini [2019-09-26 10:48:42] Config INFO Configuration file: C:\m y\a pache-jena-fuseki\r un\c onfig.ttl [2019-09-26 10:48:42] riot WARN [line: 5, col: 9 ] Bad IRI: <C:\m y\a pache-jena-fuseki\r un\c onfig.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: PREFIX rdf: <http: PREFIX rdfs: <http: 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 rdfs:label "movie #35" 2 <file:// /C:/my /d2rq/ baidu_baike.nt rdf:type :Movie 3 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_language "粤语" 4 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_screenwriter "王晶" 5 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_rekeaseTime "1992年07月30日" 6 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_prodTime "None" 7 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_id "35" ^^xsd:integer8 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_foreName "Royal Tramp" 9 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_genre "动作" 10 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_star "周星驰,温兆伦,邱淑贞,张敏,吴孟达,徐锦江" 11 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_achiem "None" 12 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_chName "鹿鼎记" 13 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_director "王晶" 14 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_prodCompany "香港永盛电影公司" 15 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_bio " 《鹿鼎记》是改编自金庸小说的一部武侠喜剧。影片由王晶执导,周星驰、吴孟达、温兆伦、林青霞 、 李嘉欣、袁洁莹、邱淑贞、陈德容等联合出演。影片讲述清朝初期,康熙皇帝年少,奸臣鳌拜从中控制政权。韦小宝有幸加入推翻清朝的民间组织“天地会”,被派到王宫当卧底,偷取藏有清朝秘密的四十二章经。韦小宝很快成为皇上的心腹,做了大官。他既要执行任务却又跟皇帝成为了好朋友,陷入了两难的状态。 [1] 该片于1992年7月30日上映。 " 16 <file:// /C:/my /d2rq/ baidu_baike.nt :movie_length "106 分钟"
4. 本体建模 为了能够让Jena在我们的本体上进行推理,需要提供自定义的本体文件。本项目的本体通过protege 生成,详细流程请查看SimmerChan的专栏实践篇(一):数据准备和本体建模 。根据上述流程生成的针对本项目的本体文件为struct_to_rdf/movie_actor/kg_movie_tultle.owl。