2017-08-13 39 views
0

我需要按照與.owl文件相同的順序獲得OWL類的等價類。按順序獲取等價類

我使用此代碼

for(OWLClassExpression cls: clazz.getEquivalentClasses(ontology)) { 

Set <OWLClass> classes_of_the_Expression =cls.getClassesInSignature(); 
} 

但這個代碼讓他們隨機。

請看下面的例子,我對待。在這裏,dog_owner類是人類和狗類的等效類和交集。通過執行我的java代碼,我得到第一個狗課,然後是人類;並且我需要得到反面這意味着人類然後狗類。因爲我需要精確的等同類的第一類。

<owl:Class rdf:about="http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#dog_owner"> 
<owl:equivalentClass> 
    <owl:Class> 
    <owl:intersectionOf rdf:parseType="Collection"> 
     <owl:Class rdf:about="http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#person"/> 
     <owl:Restriction> 
     <owl:onProperty> 
      <owl:ObjectProperty rdf:about="http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#has_pet"/> 
     </owl:onProperty> 
     <owl:someValuesFrom rdf:resource="http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#dog"/> 
     </owl:Restriction> 
    </owl:intersectionOf> 
    </owl:Class> 
</owl:equivalentClass> 
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
>dog owner</rdfs:label> 
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string" 
></rdfs:comment> 

+0

我猜你正在使用的OWLAPI版本是3.5。 OWLClass對象具有可比性,因此您可以將它們添加到列表並可靠地對列表進行排序,但是不支持尊重輸入OWL文件的順序。 OWL沒有爲等價類指定強制性訂單。 爲什麼你需要提到第一個元素? – Ignazio

+0

我需要它,因爲我必須添加一個連接常規類的子類公理(在下面的示例中:dog_owner與第一個交叉點是person:因此,我需要自動添加(使用腳本)公理: 但這不是:這是我的目標 – Nina

+0

我首先將它們添加到列表中,我認爲通過這樣做,我會保持順序,但不幸的是,函數clazz.getClassesInSignature();讓它們紊亂 – Nina

回答

0

爲了既兼顧命名類中包括的等價類公理的交集,您可以使用用戶:

OWLEquivalentClassesAxiom ax=null; 
ax.accept(new OWLObjectVisitor() { 
    @Override 
    public void visit(OWLObjectIntersectionOf ce) { 
     ce.operands().filter(x->x.isOWLClass()).forEach(x->{ 
      // this is where x is Person, or any other 
      // named class in the intersection; 
      // anonymous classes are skipped 
     }); 
    } 
}); 

對於OWLAPI 3:

for(OWLClass clazzzz : ontology.getClassesInSignature()) { 
    for(OWLEquivalentClassesAxiom ax: ontology.getEquivalentClassesAxioms(clazzzz)) { 
     OWLObjectVisitorAdapter visitor = new OWLObjectVisitorAdapter() { 
     @Override 
     public void visit(OWLObjectIntersectionOf ce) { 
      for (OWLClassExpression e : ce.getOperands()) { 
       if (!e.isAnonymous()) { 
        // this is where x is Person, or any other 
        // named class in the intersection; 
        // anonymous classes are skipped 
       } 
      } 
     } 
     }; 
     ax.accept(visitor); 
    } 
} 
+0

我不明白我可以使用這段代碼的方式,我以前從未使用過訪問者。請,你能幫助我嗎?我的課是否必須擴展另一個類或實現一個接口?因爲當我將你的代碼添加到我的java類中時,接受ax的函數是未知的 – Nina

+0

您正在使用哪個版本的owl api?我的代碼是用owl api編寫的5 – Ignazio

+0

我有OWL API 3 – Nina

1

嘗試org.semanticweb.owlapi.model.OWLNaryBooleanClassExpression#getOperandsAsList方法或者其流伴侶。

請注意:OWL是RDF。 RDF不支持按設計和定義進行排序。雖然你使用「簽名」方法,但由於這些一般原因,它不應該返回有序的數據(這似乎是它爲什麼被設置)。

但owl的右側部分:intersectionOf是一個rdf:List,它總是有序的,所以應該有東西從n-ary類表達式的正確部分檢索有序信息。用法

代碼示例:

  String s = "<rdf:RDF\n" + 
      " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n" + 
      " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n" + 
      " xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" + 
      " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + 
      " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\">\n" + 
      " <owl:Ontology/>\n" + 
      " <owl:Class rdf:about=\"http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#dog_owner\">\n" + 
      " <rdfs:comment></rdfs:comment>\n" + 
      " <rdfs:label>dog owner</rdfs:label>\n" + 
      " <owl:equivalentClass>\n" + 
      "  <owl:Class>\n" + 
      "  <owl:intersectionOf rdf:parseType=\"Collection\">\n" + 
      "   <owl:Class rdf:about=\"http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#person\"/>\n" + 
      "   <owl:Restriction>\n" + 
      "   <owl:someValuesFrom rdf:resource=\"http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#dog\"/>\n" + 
      "   <owl:onProperty>\n" + 
      "    <owl:ObjectProperty rdf:about=\"http://owl.man.ac.uk/2005/07/sssw/peopleeemodifiée#has_pet\"/>\n" + 
      "   </owl:onProperty>\n" + 
      "   </owl:Restriction>\n" + 
      "  </owl:intersectionOf>\n" + 
      "  </owl:Class>\n" + 
      " </owl:equivalentClass>\n" + 
      " </owl:Class>\n" + 
      "</rdf:RDF>"; 

    OWLOntology ontology; 
    try (InputStream in = new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8))) { 
     ontology = OntManagers.createONT().loadOntologyFromOntologyDocument(in); 
    } 
    System.out.println("========"); 
    OWLEquivalentClassesAxiom equivalentClassesAxiom = ontology.axioms(AxiomType.EQUIVALENT_CLASSES).findFirst().orElseThrow(IllegalArgumentException::new); 
    OWLObjectIntersectionOf anon = equivalentClassesAxiom.classExpressions() 
      .filter(e -> ClassExpressionType.OBJECT_INTERSECTION_OF.equals(e.getClassExpressionType())) 
      .map(OWLObjectIntersectionOf.class::cast) 
      .findFirst().orElseThrow(IllegalArgumentException::new); 
    System.out.println(anon.getOperandsAsList().get(0)); // <-- always person 
    System.out.println(anon.getOperandsAsList().get(1)); // <-- always anon ObjectSomeValuesFrom 
    System.out.println(OWLObjectSomeValuesFrom.class.cast(anon.getOperandsAsList().get(1)).getFiller()); // <--always dog 
+0

之下添加一個答案就像註釋:'getOperandsAsList'不一定返回文檔的順序。它在SortedSet中使用OWL API特定的類表達式排序(OWL API 5中的流),請參閱[code](https://github.com/owlcs/owlapi/blob/version5/impl/src/主/ JAVA /英國/ AC /曼徹斯特/ CS /貓頭鷹/ owlapi/OWLNaryBooleanClassExpressionImpl。java#L39) – AKSW