知识图谱实践篇(四):Apache jena SPARQL endpoint及推理
在上一篇我們學習了如何利用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數據里面是沒有的??梢栽贒2RQ的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年代的上海,自小受盡欺辱的街頭混混阿星(周星馳)為了能出人頭地,可謂窺見機會的縫隙就往里鉆,今次他盯上行動日益猖獗的黑道勢力“斧頭幫”,想借之大名成就大業?! “⑿羌倜啊案^幫”成員試圖在一個叫“豬籠城寨”的地方對居民敲詐,不想引來真的“斧頭幫”與“豬籠城寨”居民的恩怨?!柏i籠城寨”原是藏龍臥虎之處,居民中有許多身懷絕技者(元華、梁小龍等),他們隱藏于此本是為遠離江湖恩怨,不想麻煩自動上身,躲都躲不及。而在觀戰正邪兩派的斗爭中,阿星逐漸領悟功夫的真諦。 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及推理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知识图谱实践篇(三):D2RQ SPAR
- 下一篇: CentOS 7安装Developmen