2017-08-13 12 views
0

OWLクラスの同等のクラスを.owlファイルと同じ順序で取得する必要があります。同等のクラスを順番に取得

私はこのコード

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

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

を使用しますが、このコードは、ランダムにそれらを取得します。

私が扱う症例の例を以下に見てください。ここで、dog_ownerクラスは、同等クラスで、personクラスとdogクラスの両方の共通部分です。私の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

getOperandsAsList方法やそのストリームコンパニオンをorg.semanticweb.owlapi.model.OWLNaryBooleanClassExpression試してみてください。

注:OWLはRDFです。 RDFは、設計および定義による発注をサポートしていません。 "シグネチャ"メソッドを使用しても、これらの一般的な理由により、順序付けされたデータを返すべきではありません(それがSetの理由です)。

しかし、owl:intersectionOfの右部分はrdf:Listであり、常に順序付けされているので、n-ary class-expressionの右部分から順序付けされた情報を検索するものが必要です。

の使用のコード例:

  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

コメントとして:getOperandAsListは必ずしも文書の順序を返すわけではありません。これは、SortedSet(OWL API 5のストリーム)のクラス式のOWL API固有の順序付けを使用します。[code](https://github.com/owlcs/owlapi/blob/version5/impl/src/)を参照してください。 main/java/uk/ac/manchester/cs/owl/owlapi/OWLNaryBooleanClassExpressionImpl。java#L39) – AKSW

関連する問題