文档章节

Apache jena SPARQL endpoint及推理

o
 osc_r6vi2btf
发布于 2018/08/12 21:03
字数 2456
阅读 20
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一、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   元秋  
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
DKPro Core

DKPro Core 是基于 Apache UIMA 框架之上的自然语言处理(NLP)的软件组件。DKPro Core 提供了这样的第三方工具以及原NLP组件的包装。 DKPro核心建立在很大程度上uimaFIT可以快速方便的开发N...

匿名
2012/10/24
1.8K
0
Apache Curator

zookeeper 的客户端调用过于复杂,Apache Curator 就是为了简化zookeeper客户端调用而生,利用它,可以更好的使用zookeeper。

李旸
2012/11/27
9.8K
0
Hadoop 资源管理器--Apache YARN

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,前不久被提升为高层次的Hadoop子项目。 YARN最初是为了修复MapReduce实现里的明显...

匿名
2012/12/20
3.5K
0
Hadoop 管理监控工具--Apache Ambari

Apache Ambari 是一个基于 Web 的 Apache Hadoop 集群的供应、管理和监控。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。 Ap...

匿名
2012/12/25
2.9W
3

没有更多内容

加载失败,请刷新页面

加载更多

如何在Pandas的DataFrame中的行上进行迭代? - How to iterate over rows in a DataFrame in Pandas?

问题: I have a DataFrame from pandas: 我有一个来自熊猫的DataFrame : import pandas as pdinp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]df = pd.DataFrame(......

富含淀粉
50分钟前
20
0
与电商节伴生,平台销量榜单背后还有被低估的营销价值

文 | 曾响铃 来源 | 科技向令说(xiangling0815) 时至今日,电商节已经成为各巨头零售平台例行的活动,花样在不断创新,玩法也在不断涌现。 在这个过程中,伴随电商节的各种品牌、产品销量榜...

曾响铃
51分钟前
22
0
volatile关键字详解

前言 提到JAVA的并发编程,就不得不提volatile关键字,不管是在面试还是实际开发中,volatile关键字的使用都是一个应该掌握的技能。它之所以重要,是因为它和JAVA并发编程中会遇到三种重要问...

ls_cherish
今天
15
0
比继承更偏爱组成? - Prefer composition over inheritance?

问题: Why prefer composition over inheritance? 为什么更喜欢使用组合而不是继承? What trade-offs are there for each approach? 每种方法都有哪些取舍? When should you choose inher...

javail
今天
26
0
2020软件测试工程师史上最全面试题(内含答案)-看完BATJ面试官对你竖起大拇指!

以下是软件测试相关的面试题及答案,欢迎大家参考! 我不是至尊宝,也不是孙悟空,我只是那城墙下的一猿。  1、你的测试职业发展是什么?  测试经验越多,测试能力越高。所以我的职业发展是需...

程序员一凡
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部