当前位置: 首页 > 工具软件 > Fuseki > 使用案例 >

jena fuseki 自定义推导规则(OWLFBRuleReasoner推理机)

贾俊艾
2023-12-01

访问请移步至 https://www.qingdujun.com/ ,这里有能“击穿”平行宇宙的乱序并行字节流…


在阅读《实践篇(四):Apache jena SPARQL endpoint及推理》 一文后, 发现最新版本 JENA FUSEKI (v3.8.0)自定义推导功能无法正常使用。

造成该问题,主要两大缘由:

其一,推导规则(rules.ttl)需要用逗号隔开。

@prefix : <http://www.kgdemo.com#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

[ruleComedian: (?p :hasActedIn ?m), (?m :hasGenre ?g), (?g :genreName '喜剧') 
-> (?p rdf:type :Comedian)]
[ruleInverse: (?p :hasActedIn ?m) -> (?m :hasActor ?p)]

其二,配置问题。以下为查阅官网后,重写的配置文件(fuseki_conf.ttl)。配置的主要解析过程为,
s e r v i c e &gt; d a t a s e t &gt; d e f a u l t G r a p h &gt; i n f M o d e l &gt; { j a : r e a s o n e r &gt; r u l e s . t t l j a : b a s e M o d e l &gt; t d b service&gt;dataset&gt;defaultGraph&gt;infModel&gt; \begin{cases} ja:reasoner &amp; &gt; rules.ttl\\ ja:baseModel &amp; &gt; tdb \end{cases} service>dataset>defaultGraph>infModel>{ja:reasonerja:baseModel>rules.ttl>tdb

@prefix tdb:   <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .

<#service1> rdf:type fuseki:Service ;
    fuseki:name                       "kg_demo_movie" ;     
    fuseki:serviceQuery               "sparql", "query" ; 
    fuseki:serviceReadGraphStore      "get" ;
    fuseki:dataset                   <#dataset> ;
    .

<#dataset> rdf:type ja:RDFDataset ;
	ja:defaultGraph <#modelInf> ;
	.
	
<#modelInf> rdf:type ja:InfModel ;
	ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ; 
	ja:rulesFrom <file:///D:/AppsPath/apache-jena-fuseki-3.8.0/run/databases/rules.ttl> ] ;
	ja:baseModel <#g> ;
	.
	
<#g> rdf:type tdb:GraphTDB ;
    tdb:location "E:/data/tdb" ;
    tdb:unionDefaultGraph true ; 
	.

注意, 对于一些简单的推导的话,不需要自定义推导规则,直接使用OWLFBRuleReasoner即可。

ja:reasoner [ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>] ;

最后,附上查询SPARQL内容,访问 http://localhost:3030 复制粘贴以下代码,即可完成查询。

PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?n WHERE {
?x rdf:type :Comedian.
?x :personName ?n.
}
limit 10

©qingdujun
2018-9-7 于 北京 海淀


更多阅读
[1] d2rq-0.8.1工具构建RDF模型
[2] 关于jena-fuseki SPARQL query版本问题的解决方案


附录

我注意到:原来作者在本体Ontology.ttl中定义了Comedian类。并且,在InfModel中加载了它——ontology.ttl。但是,这些操作是否必要?值得商榷。我在官网上没见到这样的写法。

定义的Comedian类:

ja:content [ja:externalContent <file:.../databases/ontology.ttl> ] ;
#################################################################
#    Classes
#################################################################
###  http://www.kgdemo.com#Comedian
:Comedian rdf:type owl:Class ;
          rdfs:subClassOf :Person .

我仔细分析了一下各种文件的生成过程,

Step 1: kg_demo_movie_mapping.ttl
下载D2RQ,进入其目录,运行下面的命令生成默认的mapping文件:

generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie

Step 2: kg_demo_movie.nt
使用下面的命令将我们的数据转为RDF:

.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl

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

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

小结: 大概可以看到,tdb是与kg_demo_movie_mapping.ttl有关。

References:
[1] https://jena.apache.org/documentation/fuseki2/fuseki-configuration.html
[2] https://gloucklegnou.github.io/MICA/TestInferences.html
[3] https://stackoverflow.com/questions/52204735/no-data-available-in-table-when-i-customize-the-rules-of-jena-fuseki
[4] https://jena.apache.org/documentation/tdb2/tdb2_fuseki.html
[5] https://blog.csdn.net/u011801161/article/details/79185464

 类似资料: