新瓶装旧酒:实践篇(四)Apache jena SPARQL endpoint及推理

2020 年 9 月 25 日 AINLP


在上一篇我们学习了如何利用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类似,只是脚本位置不同(本文选择的是3.5.0版本,可以在我公众号的资源帖里面获取下载链接,新版本的配置可能会存在不同)。


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


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


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









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


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


jena有个bug,重启fuseki服务会出现类似下面的异常信息:Mangled prefix map: graph name=java.lang.NullPointerException。只需要删掉tdb里面的数据,用tdbloader重新生成即可。


我们执行如下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-0.8.1/kg_demo_movie.nt#person/130644  周海媚  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/21914  方中信  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/66761  黎明  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/25236  杜琪峰  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/1402393  邓浩光  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/105940  许冠文  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/998494  宁静  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/29692  潘恒生  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/567303  胡枫  file:///D:/d2rq-0.8.1/kg_demo_movie.nt#person/568979  何东  


  四、总结  


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




  
  
    

说个正事哈



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心


欢迎加入知识图谱交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注知识图谱

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
1

相关内容

资源描述框架(英语:Resource Description Framework,缩写为RDF),是万维网联盟(W3C)提出的一组标记语言的技术规范,以便更为丰富地描述和表达网络资源的内容与结构。
【ISWC2020】如何高效地构建大规模知识图谱?102页ppt
专知会员服务
66+阅读 · 2020年11月7日
【知乎】超越Lexical:用于文本搜索引擎的语义检索框架
专知会员服务
21+阅读 · 2020年8月28日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
基于MySQL Binlog的Elasticsearch数据同步实践
DBAplus社群
15+阅读 · 2019年9月3日
通过Termux打造免root安卓渗透工具
黑客技术与网络安全
15+阅读 · 2019年8月16日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
40张PPT,帮你轻松入门Spark大数据!BAT架构师制作!
七月在线实验室
19+阅读 · 2019年5月27日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
【知识图谱】大规模知识图谱的构建、推理及应用
产业智能官
35+阅读 · 2017年9月12日
大规模知识图谱的构建、推理及应用
人工智能头条
15+阅读 · 2017年8月29日
VIP会员
相关资讯
基于MySQL Binlog的Elasticsearch数据同步实践
DBAplus社群
15+阅读 · 2019年9月3日
通过Termux打造免root安卓渗透工具
黑客技术与网络安全
15+阅读 · 2019年8月16日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
40张PPT,帮你轻松入门Spark大数据!BAT架构师制作!
七月在线实验室
19+阅读 · 2019年5月27日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
【知识图谱】大规模知识图谱的构建、推理及应用
产业智能官
35+阅读 · 2017年9月12日
大规模知识图谱的构建、推理及应用
人工智能头条
15+阅读 · 2017年8月29日
Top
微信扫码咨询专知VIP会员