(接上“对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 |
联系客服