(接上“對Jena的簡單理解和一個例子_1”)
3.接口OntClass
這個接口中定義了本體種與概念(也就是類Class)相關(guān)的操作,通過OntModel中的listClasses()便可以返回模型中的所有概念組成的迭代器(Iterator),然后調(diào)用OntClass的各種方法具體進行具體操作。OntoClass對概念之間的各種關(guān)系都有相應(yīng)的定義方法,典型的有添加子類、添加約束、創(chuàng)建互斥概念、迭代返回某種類型的概念以及相關(guān)的邏輯判斷等等。
第四部分的例子主要是應(yīng)用這個類的方法。
4.基本本體類型OntResource
所有本體API中用于表示本體的類繼承自O(shè)ntResource,這樣就可以在OntResource中放置所有類公用的功能,并可以為一般的方法設(shè)置通用的返回值。Java接口OntResource擴展了Jena的RDF資源接口,所以任何可以接受資源或者RDFNode的方法都可以接受OntResource,并且也就可以接受任何其他本體值。雖然這個類涵蓋了涉及本體的所有類,在例子中并沒有使用它。從Jena Java Doc可以獲得它的詳細信息。
四、例子
本文實現(xiàn)了一個簡單的例子。通過Protégé 3.1創(chuàng)建一個Creature本體,并將其存儲到OWL文件Creature.owl,然后使用和Jena通過讀取該文件創(chuàng)建本體模型,實踐Jena中的一些Ontology API。本文不涉及如何使用Protégé 3.1創(chuàng)建本體,您可以到Protégé的主頁或者是http://www./modules/wordpress/尋找詳細的資料,后者雖然只是一個博客,但確實提供了很多我們需要的資源,比如一個完整的Protégé使用教程。本文例子中對Jena的使用主要參照Jena文檔中 Jena-2.4 src-examples jena examples ontology下面的describeClass。它讀取food.owl和wine.owl兩個文件建立本體模型,并顯示模型中概念以及相關(guān)關(guān)系的詳細信息。DescribeClass.java主要負責查詢詳細信息并顯示出來,Main.java只是創(chuàng)建本體模型并調(diào)用DescribeClass.java的功能。
例子的主要代碼如下列出。
// 創(chuàng)建使用OWL語言的內(nèi)存模型
OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
ontModel.read("file:./Creature.owl"); // 讀取當前路徑下的文件,加載模型
// 定義一個類作為模型中Animal類的等等價類,并添加注釋
OntClass cls = ontModel.createClass(":DongwuClass");
cls.addComment("the EquivalentClass of Animal...", "EN");
// 通過完整的URI取得模型中的Animal類
OntClass oc = ontModel.
getOntClass("http://www./marine.owl#Animal");
oc.addEquivalentClass(cls); // 將先前定義的類添加為Animal的等價類
// 迭代顯示模型中的類,在迭代過程中完成各種操作
for (Iterator i = ontModel.listClasses(); i.hasNext();) {
OntClass c = (OntClass) i.next(); // 返回類型強制轉(zhuǎn)換
if (!c.isAnon()) { // 如果不是匿名類,則打印類的名字
System.out.print("Class");
// 獲取類的URI并輸出,在輸出時對URI做了簡化(將命名空間前綴省略)
System.out.println(c.getModel().getGraph().
getPrefixMapping().shortForm(c.getURI()));
// 處理Animal類
if (c.getLocalName().equals("Animal")) { // 如果當前類是Animal
System.out.println(" URI@" + c.getURI()); // 輸出它的完整URI // 取得它的的等價類并打印
System.out.print(" Animal's EquivalentClass is "+
c.getEquivalentClass());
// 輸出等價類的注釋
System.out.println(" [comments:" +
c.getEquivalentClass().getComment("EN")+"]");
}// 處理Animal結(jié)束
// 迭代顯示當前類的直接父類
for (Iterator it = c.listSuperClasses(); it.hasNext();)
{
OntClass sp = (OntClass) it.next();
String str = c.getModel().getGraph()
.getPrefixMapping().shortForm(c.getURI()) // 獲取URI
+ "'s superClass is " ;
String strSP = sp.getURI();
try{ // 另一種簡化處理URI的方法
str = str + ":" + strSP.substring(strSP.indexOf('#')+1);
System.out.println(" Class" +str);
}catch( Exception e ){}
} // super class ends
// 迭代顯示當前類的直接子類
for (Iterator it = c.listSubClasses(); it.hasNext();){
System.out.print(" Class");
OntClass sb = (OntClass) it.next();
System.out.println(c.getModel().getGraph().getPrefixMapping()
.shortForm(c.getURI())+ "'s suberClass is "
+ sb.getModel().getGraph().getPrefixMapping()
.shortForm(sb.getURI()));
}// suber class ends
// 迭代顯示與當前類相關(guān)的所有屬性
for(Iterator ipp = c.listDeclaredProperties(); ipp.hasNext();){
OntProperty p = (OntProperty)ipp.next();
System.out.println(" associated property: " + p.getLocalName());
}// property ends
}// anonymity ends
else // 是匿名類
{}
}// for ends
部分輸出結(jié)果如下,說明部分不在輸出中。
Class:Animal
URI@http://www./marine.owl#Animal // 完整的URI
// 等價類及其注釋
Animal's EquivalentClass is :DongwuClass [comments:the EquivalentClass of Animal...] Class:Animal's superClass is :Creature // 直接父類
Class:Animal's suberClass is :MixAnimal // 直接子類
Class:Animal's suberClass is :GrassAnimal
Class:Animal's suberClass is :MeatAnimal
associated property: eat // 關(guān)聯(lián)屬性
associated property: beEated
associated property: mainEat
后注:該例子沒有涉及Jena的推理功能,沒有實現(xiàn)屬性的過濾(只返回以當前類為主體的屬性),不能輸出間接父類(父類的父類)或間接子類,等等。因此,有待對Jena進一步熟悉之后作更多的改進。
五、參考資料
[1] Jena-2.4 doc ontology Jena 2 Ontology API文檔
[2] Jena-2.4 doc javadoc Jena 2 Java文檔
[3] Jena-2.4 src-examples jena examples ontology describeClass
[4] http://www./modules/wordpress 維基博客