对Jena的简单理解和一个例子_2

来源:百度文库 编辑:神马文学网 时间:2024/04/29 12:39:13
2007年04月25日 星期三 09:05
(接上“对Jena的简单理解和一个例子_1”)
3.接口OntClass
这个接口中定义了本体种与概念(也就是类Class)相关的操作,通过OntModel中的listClasses()便可以返回模型中的所有概念组成的迭代器(Iterator),然后调用OntClass的各种方法具体进行具体操作。OntoClass对概念之间的各种关系都有相应的定义方法,典型的有添加子类、添加约束、创建互斥概念、迭代返回某种类型的概念以及相关的逻辑判断等等。
第四部分的例子主要是应用这个类的方法。
4.基本本体类型OntResource
所有本体API中用于表示本体的类继承自OntResource,这样就可以在OntResource中放置所有类公用的功能,并可以为一般的方法设置通用的返回值。Java接口OntResource扩展了Jena的RDF资源接口,所以任何可以接受资源或者RDFNode的方法都可以接受OntResource,并且也就可以接受任何其他本体值。虽然这个类涵盖了涉及本体的所有类,在例子中并没有使用它。从Jena Java Doc可以获得它的详细信息。
四、例子
本文实现了一个简单的例子。通过Protégé 3.1创建一个Creature本体,并将其存储到OWL文件Creature.owl,然后使用和Jena通过读取该文件创建本体模型,实践Jena中的一些Ontology API。本文不涉及如何使用Protégé 3.1创建本体,您可以到Protégé的主页或者是http://www.chengtao.name/modules/wordpress/寻找详细的资料,后者虽然只是一个博客,但确实提供了很多我们需要的资源,比如一个完整的Protégé使用教程。本文例子中对Jena的使用主要参照Jena文档中 Jena-2.4 src-examples jena examples ontology下面的describeClass。它读取food.owl和wine.owl两个文件建立本体模型,并显示模型中概念以及相关关系的详细信息。DescribeClass.java主要负责查询详细信息并显示出来,Main.java只是创建本体模型并调用DescribeClass.java的功能。
例子的主要代码如下列出。
// 创建使用OWL语言的内存模型
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.owl-ontologies.com/marine.owl#Animal");
oc.addEquivalentClass(cls); // 将先前定义的类添加为Animal的等价类
// 迭代显示模型中的类,在迭代过程中完成各种操作
for (Iterator i = ontModel.listClasses(); i.hasNext();) {
OntClass c = (OntClass) i.next(); // 返回类型强制转换
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结束
// 迭代显示当前类的直接父类
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
// 迭代显示与当前类相关的所有属性
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
部分输出结果如下,说明部分不在输出中。
Class:Animal
URI@http://www.owl-ontologies.com/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 // 关联属性
associated property: beEated
associated property: mainEat
后注:该例子没有涉及Jena的推理功能,没有实现属性的过滤(只返回以当前类为主体的属性),不能输出间接父类(父类的父类)或间接子类,等等。因此,有待对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.chengtao.name/modules/wordpress 维基博客