我需要从本体获取一个类的所有直接超类,并且我只需要命名的类,而不是那些来自具有'AllValuesFrom'限制的等效表达式的类。 我尝试使用下面的代码,它适用于我创建的一些本体,但其他人从网上下载(人本体 - 比萨本体)它不起作用。
public void motherclasses_Of_One_class() {
for (OWLClass clss : ontology.getClassesInSignature())
{
if(reasoner.getSuperClasses(clss, true).getFlattened().size()>1) // if the class has more than one mother class
{// System.out.println(" \n ---------------- : \n");
System.out.println("\n class "+clss.getIRI().getFragment()+" has more than one mother classes : \n");
for(OWLClass parent: reasoner.getSuperClasses(clss, true).getFlattened())
System.out.println(parent.getIRI().getFragment());
}
}
}
我也尝试使用此版本的代码,结果与第一个版本相同
NodeSet<OWLClass> superclasses = reasoner.getSuperClasses(clss, true);
for (org.semanticweb.owlapi.reasoner.Node<OWLClass> parentOWLNode: superclasses) {
OWLClassExpression parent = parentOWLNode.getRepresentativeElement();
System.out.println(parent.getClassesInSignature());
}
下载本体的问题是,它为类返回错误的超类。我检查.OWL文件,然后是通过protégé的本体,我从问题出现时找不到。 请在下面找到一个错误的案例,以了解更多我的意思。 在示例中,'cat_owner'类只有一个母亲'人'类。正如您所看到的,pet_owner和cat_liker类与'cat_owner'类处于同一层级,它们永远不能成为'cat_owner'类的母亲,而且在'cat_owner'类的描述中,它只有一个超类' person'class ...但是在程序输出中,当列表中没有'person'类时,我将它们作为'cat_owner'类的超类。我不明白为什么...... 这是输出:
如果您有任何可能有用的想法,我将不胜感激。 谢谢
答案 0 :(得分:2)
您的代码是正确的。正如评论中所描述的那样(实际上可能是答案),您假设cat owner
不能将cat liker
作为超类,但我不相信您的数据。证明了这一点。
我的层次级别是基本的图表顺序,从上到下解析概念而不考虑语义关系和推理。
如果您想在不进行推理的情况下导航类,则不应该为此目的使用推理器。您可以通过检查本体中的子类公理来导航断言的层次结构。
答案 1 :(得分:1)
在这个问题的相同上下文中,我有另一个问题,即具有子类公理但有限制的类,我的意思是不像下面的例子那样命名类
<owl:Class rdf:about="http://owl.man.ac.uk/2005/07/sssw/Test2#Wood">
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Wood</rdfs:label>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#comes_from"/>
<owl:allValuesFrom rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#Tree"/>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#comes_from"/>
<owl:someValuesFrom rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#Nature"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
正如你所看到的,Wood类有两个子类公理,但它并不涉及一个命名类,不像下面的例子; woodenChair类有两个子类公理,它们被命名为类:木头和椅子
<owl:Class rdf:about="http://owl.man.ac.uk/2005/07/sssw/Test2#woodenChair">
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">woodenChair</rdfs:label>
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<rdf:Description rdf:about="http://owl.man.ac.uk/2005/07/sssw/Test2#Wood"/>
<rdf:Description rdf:about="http://owl.man.ac.uk/2005/07/sssw/Test2#chair"/>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
<rdfs:subClassOf rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#Wood"/>
<rdfs:subClassOf rdf:resource="http://owl.man.ac.uk/2005/07/sssw/Test2#chair"/>
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"></rdfs:comment>
</owl:Class>
这是我正在处理的代码。它的问题是,它甚至将Wood类作为具有多个子类公理的类返回;我需要的是检查它是否与命名类有关;我的意思是我只需要带有命名类的子类公理;我可以通过访问者或任何oder方法获得此结果吗?如果你能帮忙请。
public void function3WithNamedClass (){
for (OWLClass clss : ontology.getClassesInSignature())
{
if(clss.getSuperClasses(ontology).size()>1){
System.out.println("\nAsserted superclasses of " + clss.getIRI().getFragment() + " : " + clss.getSuperClasses(ontology).size()+ " classes");
for (OWLSubClassOfAxiom ax : ontology.getSubClassAxiomsForSubClass(clss)) {
OWLClassExpression superCls = ax.getSuperClass();
OWLObjectVisitorAdapter visitor = new OWLObjectVisitorAdapter() {
public void visit(OWLClass ce) {
for(OWLClass superCls : superCls.getClassesInSignature() ){
if (!superCls.isAnonymous())
System.out.println(superCls.asOWLClass().getIRI().getFragment());
}
}
};
superCls.accept(visitor);
}
}
Thank you
答案 2 :(得分:1)
对于上一期,我尝试这样做(下面的代码):
public void WithNamedClass (){
for (OWLClass clss : ontology.getClassesInSignature())
{
if(clss.getSuperClasses(ontology).size()>1 ){
System.out.println("\nAsserted superclasses of " + clss.getIRI().getFragment() + " : " + clss.getSuperClasses(ontology).size()+ " classes");
for (OWLSubClassOfAxiom ax : ontology.getSubClassAxiomsForSubClass(clss)) {
OWLClassExpression superCls = ax.getSuperClass();
if(!superCls.isAnonymous())
{
System.out.println(superCls.asOWLClass().getIRI().getFragment());
}
else
System.out.println("it's not a named class ...");
}
}
}
}
代码的问题是通过执行以下操作返回包含两种超类的所有公理:clss.getSuperClasses(ontology).size()>1
实际上,我需要的是只获得具有多个命名超类的类;这意味着:必须忽略具有2个不同子类公理的类的情况,因为最后,它只有一个命名超类的子类公理...