在閱讀《實踐篇(四):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
)。配置的主要解析過程爲,
@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
。但是,其實這些操作都是不必要的。我在官網上也沒見到這樣的寫法。
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