Jena RDF Core API

Jena是使用Java編寫的API,可以用來做本體論的新增、查詢、修改與推論。

若還沒有建立Jena環境,可以參考如何在Eclipse中建立第一個Jena專案

以下在Jena中所提到的model、statement分別可以對應到RDF graph與triple。triple(statement)通常以名詞──動詞──名詞(主詞subject、謂詞predicate、受詞object)的方式表示,例如

Shakespear write Camelot

graph則是一大堆triple的集合。

簡單操作

1.建立Model
從ModelFactory中創造預設的Model
Model model = ModelFactory.createDefaultModel();

2.從Model中建立Resource
Resource johnSmith = model.createResource(personURI);

3.對resource增加property
//addProperty(Property p, RDFNode o)
johnSmith.addProperty(VCARD.FN, fullName);



把所有的triple列出來

1.使用Statement Iterator
StmtIterator iter = model.listStatements();

2.在while迴圈中建立Statement
Statement stmt      = iter.nextStatement(); 

3.抓出getter
Resource  subject   = stmt.getSubject();     // get the subject
Property  predicate = stmt.getPredicate();   // get the predicate
RDFNode   object    = stmt.getObject();      // get the object

4.也可以直接輸出XML格式
model.write(System.out);

Triple-annotation格式
model.write(System.out, "N-TRIPLES");

讀取rdf檔案

1.建立Model
Model model = ModelFactory.createDefaultModel();

2.使用FileManager打開檔案
 InputStream in = FileManager.get().open( inputFileName );

3.列印XML
model.read(in, null);
model.write(System.out);

P.S.:找不到vc-db-1.rdf? 放在和你放jena資料夾一樣的地方就好囉

設定前置命名空間

1.建立Model
Model model = ModelFactory.createDefaultModel();

2.設定前置
 String nsA = "http://somewhere/else#";
 String nsB = "http://nowhere/else#";

3.產生resources, properties,
 Resource root = m.createResource( nsA + "root" );//類似○,代表subject與object 
 Property P = m.createProperty( nsA + "P" );      //類似→,代表predicate
 Resource x = m.createResource( nsA + "x" );      //類似○,代表subject與object

4.將resource與property間的關係建立起來
 m.add( root, P, x );

5.查看結果
 m.write( System.out );

PS.:有沒有m.setNsPrefix的差異如下:
<j.1:P rdf:resource="http://somewhere/else#x"/> //no set
<nsA:P rdf:resource="http://somewhere/else#x"/> //set

m.read("location")
http://stackoverflow.com/questions/15782656/reading-local-owl-file-using-jena-response-filenotfoundexception

抽取URI

1.新增一個Resource, 存放等一下要retrive的resource
Resource vcard = model.getResource("http://somewhere/JohnSmith/");;

2.對Resource使用getProperty,把資料抽出來
String fullName = vcard.getProperty(VCARD.FN).getString();

PS.:這邊getString會直接輸出資料值,使用toString會輸出一整串XD

3.可以對取出的Resource增加資料
vcard.addProperty(VCARD.NICKNAME, "Smithy")

4.使用StmtIterator 來把所有的property列出來
StmtIterator iter = vcard.listProperties(VCARD.NICKNAME);

查詢Model

這邊是說如果什麼事情都用model.listStatement()來做也就太累了
1.所以使用ResIterator來代替Resource的查詢,找出有VCARD:FN屬性的資源
ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);

2.進入if 迴圈 iter.hasNext print 
if (iter.hasNext()) {
    System.out.println("The database contains vcards for:");
    while (iter.hasNext()) {
        System.out.println("  " + iter.nextResource()
                                      .getProperty(VCARD.FN)
                                      .getString());
    }

有另外的方法,使用new SimpleSelector

1.再seletor中分別填入S, P, O
StmtIterator iter = model.listStatements(new SimpleSelector(null, VCARD.FN, (RDFNode) null)

操作Model

關於union, intersection與difference的操作
Model model = model1.union(model2);

容器(container)

關於容器,有三種,分別是BAG, ALT, SEQ
BAG是沒有規則隨便亂放的
ALT雖然也是沒有規則,但是基本上用來放替代品
SEQ是有規則的


Reference:

An Introduction to RDF and the Jena RDF API

沒有留言:

張貼留言