使用koala.owl列出jena中的子类(Person和Student示例)

时间:2015-08-27 11:19:59

标签: subclass jena ontology class-hierarchy

当我想象着名的koala.owl本体时,我在层次结构中看到,学生作为 MaleStudentWith3Daughters 的子类是一个学生的子类。我编写了一个代码,它提取给定类的层次结构,即当我选择类时,它的所有超类和子类都存储在一个单独的模型中。它适用于其他类,但似乎有学生 MaleStudentWith3Daughters 的问题。

以下是代码:

    //here is the code which determines all superclasses of a given class c
    //adding a class and its superclasses to new model
        public void ajouterHierarchieSupAuModel(OntClass c){
            ArrayList listesuperdirect = new ArrayList();

            OntClass sup;

            //adding super classes

                    listesuperdirect = lamere.getSuperClasseDirecte(c);
                    if(listesuperdirect!=null){
                    for(int i=0;i<listesuperdirect.size();i++)
                    {
                    sup = (OntClass) listesuperdirect.get(i);
                    OntClass supp = module.createClass(sup.toString());
                    OntClass classmodule= module.createClass(c.toString());
                    classmodule.addSuperClass(supp);

                    }

                    for( int j=0;j<listesuperdirect.size();j++){ 
                    c=(OntClass) listesuperdirect.get(j);
                    ajouterHierarchieSupAuModel(c);//recursive call
                    }
                    }
        }

 // the same thing for subclasses of a given class c

当我通过 Marsupials Forest 等课程进行实验时,它的效果非常好,但似乎学生不属于同一层次 ,尽管它们在Protégé 中属于同一层次结构。

欢迎任何答案!感谢。

1 个答案:

答案 0 :(得分:0)

我正在将我的评论汇编成答案,因为那里有很多信息,并且将自己限制为500个字符变得笨拙。

您遇到PersonStudent时遇到问题的原因是推断出了层次结构。如果查看实际的.owl文件,您将看到Student未定义为owl:subClassOf Person。相反,Student被定义为一个等同于Person的类,具有属性限制hasHabitat some UniversityisHardWorking value true

属性限制是一种特殊的类描述。它描述了一个匿名类,即满足限制的所有个体的类。 查看here以获取有关财产限制的更多信息

为了减轻您的困惑,可以将owl类视为集合,将子类视为子集。在这种特殊情况下,我们将Student的类(集合)定义为类(集合)Person和由两个提到的属性限制给出的类(集合)的交集。我们没有明确声明StudentPerson的子类(子集),但由于StudentPerson的更受限制的版本,因此推断它是一个子类(子集)。

主要区别在于明确使用rdfs:subClassOfowl:subClassOf标记。如果您查看文件,Marsupials和Forest都有rdfs:subClassOf标记。但是Student没有,但由于它是Person的受限版本,因此推断它是Person的子类。查看here以获取更多信息。

查看Jena的本体API here或Javadoc here以获取更多Jena代码特定信息。

我的建议是在尝试使用代码获取子类之前尝试在Jena中运行这个本体的推理器,它可能会更好。有关如何执行此操作的步骤,请转到here