当我想象着名的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é 中属于同一层次结构。
欢迎任何答案!感谢。
答案 0 :(得分:0)
我正在将我的评论汇编成答案,因为那里有很多信息,并且将自己限制为500个字符变得笨拙。
您遇到Person
和Student
时遇到问题的原因是推断出了层次结构。如果查看实际的.owl文件,您将看到Student未定义为owl:subClassOf Person
。相反,Student
被定义为一个等同于Person
的类,具有属性限制hasHabitat some University
和isHardWorking value true
属性限制是一种特殊的类描述。它描述了一个匿名类,即满足限制的所有个体的类。 查看here以获取有关财产限制的更多信息
为了减轻您的困惑,可以将owl类视为集合,将子类视为子集。在这种特殊情况下,我们将Student
的类(集合)定义为类(集合)Person
和由两个提到的属性限制给出的类(集合)的交集。我们没有明确声明Student
是Person
的子类(子集),但由于Student
是Person
的更受限制的版本,因此推断它是一个子类(子集)。
主要区别在于明确使用rdfs:subClassOf
或owl:subClassOf
标记。如果您查看文件,Marsupials和Forest都有rdfs:subClassOf
标记。但是Student
没有,但由于它是Person
的受限版本,因此推断它是Person的子类。查看here以获取更多信息。
查看Jena的本体API here或Javadoc here以获取更多Jena代码特定信息。
我的建议是在尝试使用代码获取子类之前尝试在Jena中运行这个本体的推理器,它可能会更好。有关如何执行此操作的步骤,请转到here