Apache Jena 是一個免費開源的支持構建語義網路和數據鏈接應用的Java 框架,由惠普實驗室開發,支持內存和永久存儲。
Apache Jena是專門用於語義網本體操作的開源Java框架,其提供RDF和SPARQL API,來查詢、修改本體和進行本體推理,並且提供了TDB和Fuseki來存儲和管理三元組。
Fuseki是Jena提供的SPARQL伺服器,也就是SPARQL endpoint。其提供了四種運行模式:單機運行、作為系統的一個服務運行、作為web應用運行或者作為一個嵌入式伺服器運行。
Jena 3.0.0後的版本需要 Java8,之後下載Jena 包和 Fuseki包:
wget http://mirrors.hust.edu.cn/apache/jena/binaries/apache-jena-3.10.0.tar.gz && tar -xvzf apache-jena-3.10.0.tar.gz; wget http://mirrors.hust.edu.cn/apache/jena/binaries/apache-jena-fuseki-3.10.0.tar.gz && tar -xvzf apache-jena-fuseki-3.10.0.tar.gz;
即可完成安裝。
TDB 是Jena用於存儲RDF的組件,是屬於存儲層面的技術。在單機情況下,它能夠提供非常高的RDF存儲性能。在下載完apache-jena後,進入 Jena 文件夾的 bin/,運行:
./tdbloader --loc="../tdb/" "path/to/NTriples"
將 NTriples 載入到TDB中。其中 --loc 指定 tdb的存儲位置。第二個參數是我們通過d2rq等工具生成的nt文件。
進入 Fuseki 的文件夾,運行 fuseki-server 程序,會得到 run 文件夾。在 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_hudong" ; 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 </home/nlp/project/thirdpart/apache-jena-fuseki-3.7.0/run/databases/kg_movie_tultle.ttl> ] ; # # #啟用OWL推理機 # #ja:reasoner [ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>] # .
<#tdbGraph> rdf:type tdb:GraphTDB ; tdb:dataset <#tdbDataset> ; . # 指定 TDB 文件的位置 <#tdbDataset> rdf:type tdb:DatasetTDB ; tdb:location "../apache-jena-3.7.0/tdb" ; .
這裡我們沒有開啟推理機,如想開啟的話,需要提供本體文件。
再次運行 fuseki-server 開啟服務。出現如下界面則表示開啟成功:
可以看到默認埠為 3030,因此在瀏覽器打開 http://localhost:3030 即可看到如下界面:
進入頁面後,點擊query 按鈕,進入查詢頁面。在下面樣式的框中輸入查詢語句。
與Turtle類似,前面的三個 PREFIX 關鍵詞指明各種URL的縮寫,如 rdfs 表示 http://www.w3.org/2000/01/rdf-schema#, 什麼都不加表示 http://www.kghudong.com#。其中 http://www.kghudong.com# 是要和你生成 nt文件時的那個 ttl 文件中的定義要對上,否則可能查詢不到東西。
下面就是查詢語句了,SELECT 關鍵詞表明了哪些變數是感興趣的。需要被匹配的圖模式出現在WHERE關鍵詞之後的括弧中。返回的查詢結果是一組被稱作綁定(binding)的映射,表示了哪些元素對應到一個給定的變數,返回結果表格的每一行是一個結果或一個綁定。
在查詢語句中,那些以 ? 開頭的被稱作變數。在上面的查詢語句中,我們引入了三個變數 ?subject、?predicate、?object。將這三個變數攜程三元組的形式就得到了一個圖模式(Graph Pattern):
?subject ?predicate ?object
三元組存儲庫(這裡就是Fuseki) 接收這個圖模式,並嘗試去找到能夠匹配這個模式的那些三元組的集合。
點擊查詢框右上方的三角形即可運行這個查詢語句,這裡我們得到如下的查詢結果:
SPARQL的全部基礎就是這個簡單的概念:嘗試去找到能夠匹配一個給定的圖模式的那些三元組的集合。SPARQL提供了更多的功能,用來指定更加複雜的模式並以不同的方式提供結果。但無論模式多麼複雜,運用的過程都是一樣的。