在上一篇我们学习了如何利用D2RQ来开启endpoint服务,但它有两个缺点:

1. 不支持直接将RDF数据通过endpoint发布到网络上。

2. 不支持推理。

这次我们介绍的Apache Jena能够解决上面两个问题。

一、Apache Jena简介

Apache Jena(后文简称Jena),是一个开源的Java语义网框架(open source Semantic Web Framework for Java),用于构建语义网和链接数据应用。下面是Jena的架构图:

本次实践我们会用到的组件有:TDB、rule reasoner和Fuseki。

1. TDB是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。目前TDB的最新版本是TDB2,且与TDB1不兼容。

2. Jena提供了RDFS、OWL和通用规则推理机。其实Jena的RDFS和OWL推理机也是通过Jena自身的通用规则推理机实现的。

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

Jena目前是使用最广泛、文档最全、社区最活跃的一个开源语义网框架。更多的细节,读者可以参考官方文档。

二、Fuseki与OWL推理实战

我们先下载Jena的最新版本(fuseki和其他的功能模块不在同一个文件中,需要分别下载apache-jena和apache-jena-fuseki)。后续操作以Windows为例,Linux类似,只是脚本位置不同。


创建一个目录(我这里命名为“tdb”)用于存放tdb数据。进入“apache-jena-X.X.X”文件夹的bat目录,可以看到很多批处理文件,我们使用“tdbloader.bat”将之前我们的RDF数据以TDB的方式存储。命令如下:

.\tdbloader.bat --loc="D:\apache jena\tdb" "D:\d2rq\kg_demo_movie.nt"

“--loc”指定tdb存储的位置,即刚才我们创建的文件夹;第二个参数是由Mysql数据转换得到的RDF数据。


进入入“apache-jena-fuseki-X.X.X”文件夹,运行“fuseki-server.bat”,然后退出。程序会为我们在当前目录自动创建“run”文件夹。将我们的本体文件“ontology.owl”移动到“run”文件夹下的“databases”文件夹中,并将“owl”后缀名改为“ttl”。在“run”文件夹下的“configuration”中,我们创建名为“fuseki_conf.ttl”的文本文件(取名没有要求),加入如下内容:

@prefix :      <http://base/#> .
@prefix tdb:   <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .:service1        a                fuseki:Service ;
fuseki:dataset                    <#dataset> ;
fuseki:name                       "kg_demo_movie" ;
fuseki:serviceQuery               "query" , "sparql" ;
fuseki:serviceReadGraphStore      "get" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:serviceUpdate              "update" ;
fuseki:serviceUpload              "upload" .<#dataset> rdf:type ja:RDFDataset ;ja:defaultGraph <#model_inf> ;.<#model_inf> a ja:InfModel ;ja:baseModel <#tdbGraph> ;#本体文件的路径ja:content [ja:externalContent <file:///D:/apache%20jena/apache-jena-fuseki-3.5.0/run/databases/ontology.ttl> ] ;#启用OWL推理机ja:reasoner [ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>] .<#tdbGraph> rdf:type tdb:GraphTDB ;tdb:dataset <#tdbDataset> ;.<#tdbDataset> rdf:type tdb:DatasetTDB ;tdb:location "D:/apache jena/tdb" ;.

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

Fuseki默认的端口是3030,浏览器访问“http://localhost:3030/”, 和之前介绍的D2RQ web界面类似,我们可以进行SPARQL查询等操作。在Python中用SPARQLWrapper向Fuseki server发送查询请求:

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 :movieTitle '功夫'.
?x ?p ?o.
}

即查询电影《功夫》的所有属性。返回的结果:

                            x                                            p                                  o
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasGenre   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#genre/14
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasGenre   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#genre/28
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasGenre   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#genre/35
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasGenre   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#genre/80
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.w3.org/1999/02/22-rdf-syntax-ns#type   http://www.kgdemo.com#Movie
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#movieRating   7.2E0
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#movieIntroduction   1940年代的上海,自小受尽欺辱的街头混混阿星(周星驰)为了能出人头地,可谓窥见机会的缝隙就往里钻,今次他盯上行动日益猖獗的黑道势力“斧头帮”,想借之大名成就大业。  阿星假冒“斧头帮”成员试图在一个叫“猪笼城寨”的地方对居民敲诈,不想引来真的“斧头帮”与“猪笼城寨”居民的恩怨。“猪笼城寨”原是藏龙卧虎之处,居民中有许多身怀绝技者(元华、梁小龙等),他们隐藏于此本是为远离江湖恩怨,不想麻烦自动上身,躲都躲不及。而在观战正邪两派的斗争中,阿星逐渐领悟功夫的真谛。
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#movieTitle   功夫
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#movieReleaseDate   2004-02-10
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.w3.org/1999/02/22-rdf-syntax-ns#type   http://www.w3.org/2002/07/owl#Thing
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/25251
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/57609
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/118745
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/57607
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/65975
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/78878
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/83635
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/119426
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/545277
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/576408
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1136808
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1173200
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1173216
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1173223
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1173224
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1287732
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.kgdemo.com#hasActor   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1676386
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.w3.org/1999/02/22-rdf-syntax-ns#type   http://www.w3.org/2000/01/rdf-schema#Resource
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470   http://www.w3.org/2002/07/owl#sameAs   file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/9470

电影的“hasActor”属性是通过OWL推理机得到的,即我们原本的RDF数据里面是没有的。可以在D2RQ的endpoint中进行同样的查询,得到如下结果:

                   x                                        p                                  o
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#movieRating   7.2E0
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#movieIntroduction   1940年代的上海,自小受尽欺辱的街头混混阿星(周星驰)为了能出人头地,可谓窥见机会的缝隙就往里钻,今次他盯上行动日益猖獗的黑道势力“斧头帮”,想借之大名成就大业。  阿星假冒“斧头帮”成员试图在一个叫“猪笼城寨”的地方对居民敲诈,不想引来真的“斧头帮”与“猪笼城寨”居民的恩怨。“猪笼城寨”原是藏龙卧虎之处,居民中有许多身怀绝技者(元华、梁小龙等),他们隐藏于此本是为远离江湖恩怨,不想麻烦自动上身,躲都躲不及。而在观战正邪两派的斗争中,阿星逐渐领悟功夫的真谛。
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#hasGenre   http://localhost:2020/resource/genre/14
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#hasGenre   http://localhost:2020/resource/genre/28
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#hasGenre   http://localhost:2020/resource/genre/35
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#hasGenre   http://localhost:2020/resource/genre/80
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#movieReleaseDate   2004-02-10
http://localhost:2020/resource/movie/9470   http://www.kgdemo.com#movieTitle   功夫
http://localhost:2020/resource/movie/9470   http://www.w3.org/1999/02/22-rdf-syntax-ns#type   http://www.kgdemo.com#Movie 

这些是真实存在于“kg_demo_movie.nt”的数据。

三、规则推理实战

在“databases”文件夹下新建一个文本文件“rules.ttl”,填入如下内容:

@prefix : <http://www.kgdemo.com#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <XML Schema> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .[ruleComedian: (?p :hasActedIn ?m) (?m :hasGenre ?g) (?g :genreName '喜剧') -> (?p rdf:type :Comedian)]
[ruleInverse: (?p :hasActedIn ?m) -> (?m :hasActor ?p)]

我们定义了一个名为“ruleComedian”的规则,它的意思是:如果有一个演员,出演了一部喜剧电影,那么他就是一位喜剧演员。修改配置文件“fuseki_conf.ttl”:

@prefix :      <http://base/#> .
@prefix tdb:   <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .:service1        a                fuseki:Service ;
fuseki:dataset                    <#dataset> ;
fuseki:name                       "kg_demo_movie" ;
fuseki:serviceQuery               "query" , "sparql" ;
fuseki:serviceReadGraphStore      "get" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:serviceUpdate              "update" ;
fuseki:serviceUpload              "upload" .<#dataset> rdf:type ja:RDFDataset ;ja:defaultGraph <#model_inf> ;.<#model_inf> a ja:InfModel ;ja:baseModel <#tdbGraph> ;#本体文件的路径ja:content [ja:externalContent <file:///D:/apache%20jena/apache-jena-fuseki-3.5.0/run/databases/ontology.ttl> ] ;#关闭OWL推理机#ja:reasoner [ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>] .#开启规则推理机,并指定规则文件路径ja:reasoner [ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ; ja:rulesFrom <file:///D:/apache%20jena/apache-jena-fuseki-3.5.0/run/databases/rules.ttl> ; ].<#tdbGraph> rdf:type tdb:GraphTDB ;tdb:dataset <#tdbDataset> ;.<#tdbDataset> rdf:type tdb:DatasetTDB ;tdb:location "D:/apache jena/tdb_for_demo" ;.

我们只能启用一种推理机。前面也提到,OWL的推理功能也可以在规则推理机里面实现,因此我们定义了“ruleInverse”来表示“hasActedIn”和“hasActor”的相反关系。更多细节读者可以参考文档。

我们执行如下SPARQL查询,喜剧演员有哪些:

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 rdf:type :Comedian.
?x :personName ?n.
}
limit 10

查询结果:

                            x                                 n
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/111298   郑丹瑞
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/70591   陈欣健
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/116351   沈殿霞
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/116052   鲍汉琳
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1002925   张同祖
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/62423   林正英
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1614091   林琪欣
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/224929   陈法蓉
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1135398   叶世荣
file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/119426   元秋  

四、总结

本次实践介绍了如何使用Jena来开启endpoint服务,提供高效的查询;并介绍了如何加入推理引擎。我们是用Jena提供的命令行工具来完成上述操作。实际上,jena提供了所有工具的API接口,读者可以用Java编写程序,进行开发。相关文件已上传至github。另外,下一篇文章是实践篇的最后一篇,我们会结合前面的练习,介绍如何实现一个简易的问答程序。

https://zhuanlan.zhihu.com/p/33224431

知识图谱实践篇(四):Apache jena SPARQL endpoint及推理相关推荐

  1. 知识图谱实践篇(三):D2RQ SPARQL endpoint与两种交互方式

    这次我们介绍利用D2RQ开启SPARQL endpoint服务和两种交互方式:在浏览器中进行查询或者编写python脚本进行交互.跳过之前实践篇练习的读者,需要做的准备有:导入数据到Mysql,下载m ...

  2. 知识图谱实践篇(五):KBQA Demo

    作为实践篇的最后一篇,我们将介绍如何用Python完成一个简易的问答程序.下图是demo的展示效果: 查询结果为空,回答"I don't know.":不能理解问句,回答" ...

  3. 知识图谱实践篇(二):关系数据库到RDF

    上一篇文章介绍了我们所使用的数据.其实,知识图谱数据的来源主要有三个:结构化数据.半结构化数据和非结构化的数据.我们所使用的电影数据就是结构化的数据.半结构化的数据指的是数据有一定的组织形式,但较结构 ...

  4. 知识图谱实践篇(一):数据准备和本体建模

    对知识图谱有兴趣的读者可以关注我的知乎专栏,主要介绍知识图谱的相关概念.技术,也包含一些具体实践. 通过前面几篇文章的介绍,读者应该对知识图谱,其相关概念,以及语义网技术栈中的RDF,RDFS/OWL ...

  5. 知识图谱(四)——实体识别和扩展

    实体是知识图谱的基本单元,也是文本中承载信息的重要语言单位. 按照国际公开评测(automatic content extraction, ACE)的定义,在文本中对实体的引用(entity ment ...

  6. 知识图谱(一):概念与构建

    一.引言 随着互联网的发展,网络数据内容呈现爆炸式增长的态势.由于互联网内容的大规模.异质多元.组织结构松散的特点,给人们有效获取信息和知识提出了挑战.知识图谱(Knowledge Graph) 以其 ...

  7. 【知识图谱】知识存储

    文章目录 一.图数据库 1.概述 2.开源数据库介绍 (1)RDF4J (2)gStore 3.商业数据库介绍 (1)Virtuoso (2)Allgrograph (3)Stardog 4.原生数据 ...

  8. 知识图谱——领域知识问答系统简单介绍

    一.概念介绍 [知识图谱] A knowledge graph consists of a set of interconnected typed entities and their attribu ...

  9. 【知识图谱】 | 《知识图谱——方法、实践与应用》阅读笔记

    <知识图谱--方法.实践与应用>的阅读笔记 知识图谱--方法.实践与应用 第1章 知识图谱概述 1.1 什么是知识图谱 1.2 知识图谱的发展历史 1.3 知识图谱的价值 1.4 国内外典 ...

最新文章

  1. 杀进程和取文件最近使用时间
  2. 一种绕过Android P对非SDK接口限制的简单方法
  3. c语言isfinite_csqrtf - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  4. SAP License:SD和其他模块集成要点
  5. Linux常用指令---快捷键
  6. Activity返回值
  7. 企业微信可以同步微信好友吗?怎么同步?
  8. 怎样在视频上加字幕,分享视频添加字幕的小技巧
  9. ECS 入门到入土: 一、什么是 ECS
  10. 锁定计算机过久电脑自动关机,为什么电脑一锁定就会自动关机
  11. 常见CSS鼠标悬浮动画-hover属性
  12. c语言基础知识选择题,C语言基础知识选择试题.doc
  13. 新年开工第一篇文章——推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器
  14. python爬取足球比赛信息(一)
  15. 护士计算机怎么报名,(湘潭财经)湘潭财经职业技术学校报名计算机|航空|护士护理...
  16. 【Jquery】Pjax的了解与应用
  17. elastic job (一) elastic-job-lite----SimpleJob
  18. 三亚潜水注意事项 潜水的基本常识
  19. 无Internet访问权限却可以上网
  20. 10万亿的新房市场,为何没有一家现象级的电商?

热门文章

  1. QML中MouseArea元素的介绍
  2. php 将查询出的数组数据存入redis
  3. js中字符替换函数String.replace()使用技巧
  4. Android 线程 thread 两种实现方法!
  5. Tensorflow:interactivesession和session的区别。
  6. linux系统安装yum环境
  7. 详解 TCP 和 UDP
  8. 根据二叉树前序遍历和中序遍历重建二叉树
  9. 【Leetcode】二叉树展开为列表(递归思想)
  10. 科大星云诗社动态20201228