一级超级类owlapi
Super classes of one classe owl api
我需要从 ontology 中获得一个 class 的所有直接超级 classes,我只需要命名为 classes,而不是从等价物中获得的那些具有 'AllValuesFrom' 限制的表达式。
我尝试使用下面的代码,它适用于我创建的一些本体,但其他从网上下载的本体(人 ontology - 披萨 ontology)不起作用。
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());
}
下载本体的问题,它 returns 对 class 的超级 class 错误。我检查了 .OWL 文件,然后通过 protégé 检查了 ontology,我无法从问题出现时找到。
请在下面找到一个错误的案例,以更多地理解我的意思。
在示例中,'cat_owner' class 只有一位母亲 'person' class。如你所见,pet_owner和cat_likerclasses与'cat_owner'class处于同一层级,他们永远不可能成为[=26=的母亲] ] class,而且比'cat_owner' class的描述中只有一个超级class 'person' class...但是在当列表中不存在 'person' class 时,程序输出我将它们作为 'cat_owner' class 的 superclasses。我不明白为什么...
这是输出:
如果您有任何想法可以帮助,我将不胜感激。
谢谢
您的代码是正确的。如评论中所述(实际上可能是答案),您假设 cat owner
不能将 cat liker
作为超类,但我不相信您显示的数据证明了这一点。
The hierarchical level for me is the basic graph order, parsing concepts from top to bottom without taking into account semantic relationships and inference.
如果您想在 类 中导航而不进行推理,则不应为此目的使用推理器。您可以通过检查 ontology.
中的子类公理来导航断言的层次结构
在这个问题的相同上下文中,我有另一个问题,即 classes 具有 subclass 公理但有限制,我的意思是不像 class下面的示例
<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 class 有两个子class 公理,但它不涉及命名 class,这与下面的示例不同; woodenChair class 有两个名为 classes 的子class 公理:wood 和 chair
<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>
这是我正在处理的代码。它的问题是 returns 甚至 Wood class 作为 class 具有多个子 class 公理;我需要的是检查它是否与 named class 相关;我的意思是我只需要名为 class 的子 class 公理;我可以通过使用访问者或任何其他方法得到这个结果吗?如果你能帮忙,请。
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
对于最后一期,我尝试这样做(下面的代码):
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 ...");
}
}
}
}
通过执行此操作 return 具有两种超级class 的所有公理的代码问题:clss.getSuperClasses(ontology).size()>1
实际上,我需要的是 classes 有多个 Named superclass;这意味着:必须忽略 class 具有 2 个不同的 subclass 公理的情况,因为最后,它只有一个 subclass 命名的 superclass 公理。 ..
我需要从 ontology 中获得一个 class 的所有直接超级 classes,我只需要命名为 classes,而不是从等价物中获得的那些具有 'AllValuesFrom' 限制的表达式。 我尝试使用下面的代码,它适用于我创建的一些本体,但其他从网上下载的本体(人 ontology - 披萨 ontology)不起作用。
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());
}
下载本体的问题,它 returns 对 class 的超级 class 错误。我检查了 .OWL 文件,然后通过 protégé 检查了 ontology,我无法从问题出现时找到。
请在下面找到一个错误的案例,以更多地理解我的意思。
如果您有任何想法可以帮助,我将不胜感激。 谢谢
您的代码是正确的。如评论中所述(实际上可能是答案),您假设 cat owner
不能将 cat liker
作为超类,但我不相信您显示的数据证明了这一点。
The hierarchical level for me is the basic graph order, parsing concepts from top to bottom without taking into account semantic relationships and inference.
如果您想在 类 中导航而不进行推理,则不应为此目的使用推理器。您可以通过检查 ontology.
中的子类公理来导航断言的层次结构在这个问题的相同上下文中,我有另一个问题,即 classes 具有 subclass 公理但有限制,我的意思是不像 class下面的示例
<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 class 有两个子class 公理,但它不涉及命名 class,这与下面的示例不同; woodenChair class 有两个名为 classes 的子class 公理:wood 和 chair
<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>
这是我正在处理的代码。它的问题是 returns 甚至 Wood class 作为 class 具有多个子 class 公理;我需要的是检查它是否与 named class 相关;我的意思是我只需要名为 class 的子 class 公理;我可以通过使用访问者或任何其他方法得到这个结果吗?如果你能帮忙,请。
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
对于最后一期,我尝试这样做(下面的代码):
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 ...");
}
}
}
}
通过执行此操作 return 具有两种超级class 的所有公理的代码问题:clss.getSuperClasses(ontology).size()>1
实际上,我需要的是 classes 有多个 Named superclass;这意味着:必须忽略 class 具有 2 个不同的 subclass 公理的情况,因为最后,它只有一个 subclass 命名的 superclass 公理。 ..