超级类别的一个classe owl api

时间:2017-09-30 11:12:29

标签: java owl owl-api

我需要从本体获取一个类的所有直接超类,并且我只需要命名的类,而不是那些来自具有'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é的本体,我从问题出现时找不到。 请在下面找到一个错误的案例,以了解更多我的意思。 enter image description here 在示例中,'cat_owner'类只有一个母亲'人'类。正如您所看到的,pet_owner和cat_liker类与'cat_owner'类处于同一层级,它们永远不能成为'cat_owner'类的母亲,而且在'cat_owner'类的描述中,它只有一个超类' person'class ...但是在程序输出中,当列表中没有'person'类时,我将它们作为'cat_owner'类的超类。我不明白为什么...... 这是输出:   enter code here

如果您有任何可能有用的想法,我将不胜感激。 谢谢

3 个答案:

答案 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个不同子类公理的类的情况,因为最后,它只有一个命名超类的子类公理...