第二步 在D2RQ平臺上配置jena環境

第二步 在D2RQ平臺上配置jena環境
2013年10月16日 9:48:53
搞了這麼長時間語義,只用過protege這樣的工具,一直沒有落實到實際代碼上。jena也看過很久了,總認爲是hp公司的東西算不上標準,如今看來,jena已是語義應用開發中最主流的工具了,我就此選擇jena進行語義應用的開發了。
 
 
Getting started with Apache Jena

Apache Jena (or Jena in short) 是免費開源的java框架用於構建語義網應用和關聯數據應用。這個框架包括不一樣的處理RDF數據的API接口。若是你是菜鳥,你能夠選擇從下面的教程中開始,你也能夠瀏覽感興趣的主題文檔。
 
Tutorials
居然發現有大牛已經作過翻譯了,好吧,我轉載在這裏,我鄭重聲明轉載了「april 1019」這位大牛的工做,

Jena文檔《An Introduction to RDF and the Jena RDF API》的譯文html

文檔裏包含的內容不少,仍是回到具體的配置上來。前端

 
Using the D2RQ Engine with Jena

 1. Jena Versions
    因爲D2RQ內部嵌入了jena和SPARQL查詢引擎,因此對jena和ARQ是敏感的。D2RQ只在相應的jena版本下工做。檢索/lib/arq-X.Y目錄下各包的版本,如下載合適的jena包。
    我下載的D2RQ是0.8.1,其/lib裏面的jena的jar是2.7.0,因此從http://archive.apache.org/dist/jena/binaries/這裏下載了apache-jena-2.7.0-incubating.tar.gz。仍是解壓到/opt文件夾下。
 
2. 配置路徑
    新建一個eclipse工程jena_test,而後右鍵-Build Path-Add Library-User Library,再把/opt/D2RServer/d2rq-0.8.1/lib下的d2rq-0.8.1.jar,添加入項目中。相似再添加commons-logging-1.1.jar和slf4j-api-1.6.4.jar到項目中,而後把/lib/db-drivers下的JDBC也加進來。
    D2RQ下載時會忽略一些Jena/ARQ jar,但這些jar也有能夠會用到。能夠把下載的放到這個lib中去。
 
3. Logging
    D2RQ經過Apache Commons Logging的API記錄日誌信息。D2RQ搭載了Apache log4j(見注1),但你也可使用不一樣的前端日誌。
爲了獲取D2RQ的調試信息,設置日誌記錄器的級別從de.fuberlin.wiwiss.d2rq改成ALL.簡單的方法便是把/lib/logging的目錄添加到構建路徑中,新建一個文件log4j.properties,包括如下內容:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %-5p %-20c{1} :: %m%n
log4j.logger.de.fuberlin.wiwiss.d2rq=ALL
我在/lib/logging下新建了log4j.properties文件,複製了上面的內容,並把它也加到了項目中。
 
4. 經過jena模型的API使用D2RQ
ModelD2RQ類爲D2RQ映射數據庫中的數據提供了一個Jena的模型視圖。
下面的例子經過使用一個預先建立的映射文件介紹ModelD2RQ是如何建立的,也介紹瞭如何用Jena API從模型中提取論文及做者信息。
// Set up the ModelD2RQ using a mapping file
Model m = new ModelD2RQ("file:doc/example/mapping-iswc.ttl");
 
// Find anything with an rdf:type of iswc:InProceedings
StmtIterator paperIt = m.listStatements(null, RDF.type, ISWC.InProceedings);
 
// List found papers and print their titles
while (paperIt.hasNext()) {
    Resource paper = paperIt.nextStatement().getSubject();
    System.out.println("Paper: " + paper.getProperty(DC.title).getString());
 
    // List authors of the paper and print their names
    StmtIterator authorIt = paper.listProperties(DC.creator);
    while (authorIt.hasNext()) {
        Resource author = authorIt.nextStatement().getResource();
        System.out.println("Author: " + author.getProperty(FOAF.name).getString());
    }
    System.out.println();
}
m.close();
其中ISWC和FOAF類在Jena的schemagen工具中建立了, DC and RDF類也是Jena的一部分。
 
5. 經過jena圖的API使用D2RQ
    在一些狀況中,最好用低水平的Jena圖的API,而不是模型API,D2RQ提供圖的接口的實現,即GraphD2RQ.
下面的例子是介紹圖API來查找2003年發表的全部論文。
// Load mapping file
Model mapModel = FileManager.get().loadModel("doc/example/mapping-iswc.ttl");
 
// Parse mapping file
MapParser parser = new MapParser(mapModel, "http://localhost:2020/");
Mapping mapping = parser.parse();
 
// Set up the GraphD2RQ
GraphD2RQ g = new GraphD2RQ(mapping);
 
// Create a find(spo) pattern
Node subject = Node.ANY;
Node predicate = DC.date.asNode();
Node object = Node.createLiteral("2003", null, XSDDatatype.XSDgYear);
Triple pattern = new Triple(subject, predicate, object);
 
// Query the graph
Iterator<Triple> it = g.find(pattern);
 
// Output query results
while (it.hasNext()) {
    Triple t = (Triple) it.next();
    System.out.println("Published in 2003: " + t.getSubject());
};
g.close();
 
5.1 還有一個CachingGraphD2RQ
除了CachingGraphD2RQ,還有一個CachingGraphD2RQ可以提供相同的API,使用LRU(最近最少使用算法)
緩存記憶最近幾個查詢的結果。這會改進重複查詢的效果,若是數據庫在CachingGraphD2RQ類的使用期間發生改變的話,會報出數據的不一致性。
 
6. Executing SPARQL queries against a ModelD2RQ
D2RQ能夠經過D2RQ模型響應SPARQL查詢,下面的例子介紹D2RQ模型是如何建立的,以及SPARQL查詢是如何執行的、結果是如何寫入控制檯的。
ModelD2RQ m = new ModelD2RQ("file:doc/example/mapping-iswc.ttl");
String sparql =
    "PREFIX dc: <http://purl.org/dc/elements/1.1/>" +
    "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" +
    "SELECT ?paperTitle ?authorName WHERE {" +
    "    ?paper dc:title ?paperTitle . " +
    "    ?paper dc:creator ?author ." +
    "    ?author foaf:name ?authorName ." +
    "}";
Query q = QueryFactory.create(sparql);
ResultSet rs = QueryExecutionFactory.create(q, m).execSelect();
while (rs.hasNext()) {
    QuerySolution row = rs.nextSolution();
    System.out.println("Title: " + row.getLiteral("paperTitle").getString());
    System.out.println("Author: " + row.getLiteral("authorName").getString());
};
m.close();
 
7. The D2RQ Assembler
D2RQ自帶Jena編譯器,Jena編譯器的規格是RDF的配置文件,文件描述瞭如何構建一個Jena模型。更多的Jena編譯器的信息,請看 Jena Assembler quickstart page.
下面的例子介紹了D2RQ模型的編譯規格
@prefix : <#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
 
<> ja:imports d2rq: .
 
:myModel
    a d2rq:D2RQModel;
    d2rq:mappingFile <mapping-iswc.ttl>;
    d2rq:resourceBaseURI <http://localhost:2020/>;
    .
D2RQ模型規格支持下面兩種特性:
d2rq:mappingFile:必要的,使用D2RQ的映射文件的URI來構建模型。
d2rq:resourceBaseURI:設置基礎URI來代替相對URI模型,轉變爲全URI。若是不特指的話,D2RQ會特選擇一個適當的基礎URI。
下面的這種慣例用法,將從一個模型規範中建立一個D2RQ模型,並把它寫入控制檯。
// Load assembler specification from file
Model assemblerSpec = FileManager.get().loadModel("doc/example/assembler.ttl");
 
// Get the model resource
Resource modelSpec = assemblerSpec.createResource(assemblerSpec.expandPrefix(":myModel"));
 
// Assemble a model
Model m = Assembler.general.openModel(modelSpec);
 
// Write it to System.out
m.write(System.out);
 
m.close();
 
8. Javadoc API documentation
    Javadoc API documentation for the latest release is available.
 

 

 
注1:Log4j是Apache的一個開放源代碼項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。最使人感興趣的就是,這些能夠經過一個配置文件來靈活地進行配置,而不須要修改應用的代碼。
 
 
第二步就寫到這裏,供你們參考。有須要交流的能夠加QQ: 1q7q1q5q3q6q0q1q8(去掉中間的q)。
 
 
 



相關文章
相關標籤/搜索