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中創造預設的ModelModel model = ModelFactory.createDefaultModel();
2.從Model中建立Resource
Resource johnSmith = model.createResource(personURI);
3.對resource增加property
把所有的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與objectProperty P = m.createProperty( nsA + "P" );
//類似→
,代表predicateResource 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雖然也是沒有規則,但是基本上用來放替代品
沒有留言:
張貼留言