对Jena的简单理解和一个例子(下)

 

(接上“对Jena的简单理解和一个例子(上)”)

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 维基博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值