Jena-TDB官方文檔 反正我是沒看懂→_→
網(wǎng)上有一些在線的endpoint可以使用嚎货,例如dbpedia的可以戳這里摹蘑,但是在線的endpoint不太穩(wěn)定而且定制性不強沪曙,最要命的是很容易timeout鹊奖,如果想在本地查詢的話就可以搭建一個Jena的環(huán)境吠裆。
安裝的話建議用Maven吧渐逃,官方安裝教程戳這里够掠,這個教程親測沒有問題,就是在pom.xml
里添加以下內(nèi)容即可(注意把版本號X.Y.Z改成最新版):
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>X.Y.Z</version>
</dependency>
Jena的安裝不是本文的重點茄菊,下面說一下TDB官網(wǎng)的介紹如下
TDB is a component of Jena for RDF storage and query. It support the full range of Jena APIs. TDB can be used as a high performance RDF store on a single machine.
原理我沒有仔細研究疯潭,只說我自己感性的認識就是對于原始數(shù)據(jù)(.nt, .ttl, .xml),第一次需要load進TDB(會花費比較長的時間面殖,取決于數(shù)據(jù)的大惺ā),也就是TDB會對這些數(shù)據(jù)進行自己的索引并存盤脊僚,之后要再查詢就是訪問索引過的TDB數(shù)據(jù)相叁,所以不需要再load,速度就會提升不少吃挑。要把數(shù)據(jù)load進tdb有兩種方式钝荡,一種是通過命令行,一種是通過API舶衬,下面分別進行介紹埠通。
1 API方式
load相關(guān)代碼如下
String directory = "path\\to\\tdb"; //tdb索引希望存放的位置
Dataset dataset = TDBFactory.createDataset(directory);
dataset.begin(ReadWrite.WRITE); //開始一個transaction
Model tdb = dataset.getDefaultModel();
String source = "path\\to\\dataset.ttl"; //數(shù)據(jù)文件所在的位置
FileManager.get().readModel(tdb, source); //讀入數(shù)據(jù)
dataset.commit(); //非常重要!把數(shù)據(jù)真正提交給tdb
dataset.end(); //結(jié)束一個transaction
以上代碼只需要運行一次逛犹,tdb索引即可建好端辱,下次進行tdb查詢時不需要再進行readModel
這一步驟梁剔,相關(guān)查詢代碼如下
String directory = "path\\to\\tdb"; //tdb索引位置,和上面設(shè)置的一樣
Dataset dataset = TDBFactory.createDataset(directory);
Model tdb = dataset.getDefaultModel(); //因為tdb索引已經(jīng)存在舞蔽,所以不需要再指定數(shù)據(jù)文件的位置
String queryString = "SELECT DISTINCT ?p WHERE { ?s ?p ?o. }"; //一個簡單的sparql查詢荣病,返回所有謂詞(相同的只顯示一次)
Query query = QueryFactory.create(queryString);
try(QueryExecution qexec = QueryExecutionFactory.create(query, tdb)){
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query) ;
}
返回的結(jié)果類似于這樣:
-------------------------------------------------------
| p |
=======================================================
| <http://yago-knowledge.org/resource/hasGloss> |
| <http://yago-knowledge.org/resource/occursSince> |
| <http://yago-knowledge.org/resource/occursUntil> |
| <http://yago-knowledge.org/resource/byTransport> |
| <http://yago-knowledge.org/resource/hasPredecessor> |
| <http://yago-knowledge.org/resource/hasSuccessor> |
| <http://www.w3.org/2000/01/rdf-schema#comment> |
-------------------------------------------------------
2 命令行方式
命令行方式更加簡單,下載jena以后解壓渗柿,把文件夾所在位置設(shè)置成一個叫%JENA_HOME%
的環(huán)境變量后即可開始操作个盆。在命令行中輸入以下命令load數(shù)據(jù):
>tdbloader --loc=path\to\tdb path\to\dataset.ttl
使用tdbquery
進行查詢的語句如下:
>tdbquery --loc=path\to\tdb --query=q1.rq
其中q1.rq中存放的是如下的查詢語句:
SELECT DISTINCT ?p WHERE {?s ?p ?o. }
然后會得到和第一部分相同的結(jié)果。另外想知道數(shù)據(jù)是否load成功可以在命令行中輸入以下語句:
>tdbdump --loc=path\to\tdb
通過這種方式載入的數(shù)據(jù)為default graph朵栖,如果需要載入named graph可以用以下語句:
>tdbloader --loc=path\to\tdb -graph=namedgraph.ttl namedgraph.ttl
補充閱讀:SPARQL by Example 一個我覺得比較棒的SPARQL教程颊亮,還介紹了一些有名的數(shù)據(jù)庫。Jena的sparql教程感覺太簡單了陨溅,W3C上的太繁瑣终惑,這個剛好。