2017-12-28 14 views
1

各オブジェクトプロパティの "someValuesFrom"のすべての値をリストとして取得したいと考えています。JenaでオブジェクトプロパティクラスのsomeValuesFromを取得

私はフクロウファイルのこの部分を持っている:

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#ErgativeFrame"> 
    <owl:equivalentClass> 
     <owl:Restriction> 
      <owl:onProperty rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#hasAgent"/> 
      <owl:someValuesFrom> 
       <owl:Class> 
        <owl:unionOf rdf:parseType="Collection"> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Animal"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Object"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Person"/> 
        </owl:unionOf> 
       </owl:Class> 
      </owl:someValuesFrom> 
     </owl:Restriction> 
    </owl:equivalentClass> 
    <owl:equivalentClass> 
     <owl:Restriction> 
      <owl:onProperty rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#hasMainAction"/> 
      <owl:someValuesFrom rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#ErgativeVerb"/> 
     </owl:Restriction> 
    </owl:equivalentClass> 
    <owl:equivalentClass> 
     <owl:Restriction> 
      <owl:onProperty rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#hasOptionalPatient"/> 
      <owl:someValuesFrom> 
       <owl:Class> 
        <owl:unionOf rdf:parseType="Collection"> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Animal"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Beverage"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#BodyPart"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#ClosedLocation"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Clothing"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Food"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Furniture"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#NatureElement"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#NaturePhenomenon"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#OpenLocation"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Person"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Toy"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Transport"/> 
         <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Vegetal"/> 
        </owl:unionOf> 
       </owl:Class> 
      </owl:someValuesFrom> 
     </owl:Restriction> 
    </owl:equivalentClass> 
    <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Frame"/> 
</owl:Class> 

私はこのような何か試してみた:画面上に印刷された「制限あり」の量に等しいです

OntClass ontClass = this.ontModel.getOntClass(NS_OWL + "ErgativeFrame"); 
List<OntClass> list = ontClass.listEquivalentClasses().toList(); 

for (OntClass equiv: list) { 
    if (equiv.isRestriction()) { 
     System.out.println("is restriction"); 
     System.out.println(equiv.getLocalName()); 
    } 
} 

をプロパティの長さですが、getLocalNameは常に "null"です。

私は何をしなければなりませんか?

EDIT:プロパティの名前がコードで正しく変更されています(下記参照)。 私はまだ "someValueFrom"を取得できません。あなたが割り当てられたURIなしで匿名クラスとプロパティ、つまりクラスとプロパティを使用しているため

OntClass ontClass = this.ontModel.getOntClass(NS_OWL + "ErgativeFrame"); 
List<OntClass> list = ontClass.listEquivalentClasses().toList(); 

for (OntClass equiv: list) { 
    if (equiv.isRestriction()) { 
     System.out.println("is restriction"); 
     System.out.println(equiv.asRestriction().getOnProperty().getLocalName()); 
    } 
} 

答えて

0

getLocalNamenullを返している理由です。 JenaはURIを見つけることができないので、nullを返します。ここでは、説明するために

は、名前のクラスとプロパティではなく、匿名クラスとプロパティを使用してオントロジーのサブセットです:

<rdf:Description rdf:about="http://www.w3.org/2002/07/owl#topObjectProperty"> 
    <rdfs:range rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#AnimalObjectPerson"/> 
</rdf:Description> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Frame"/> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Object"/> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Person"/> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Animal"/> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#AnimalObjectPerson"> 
    <owl:equivalentClass> 
     <owl:Class> 
      <owl:unionOf rdf:parseType="Collection"> 
       <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Animal"/> 
       <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Object"/> 
       <rdf:Description rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Person"/> 
      </owl:unionOf> 
     </owl:Class> 
    </owl:equivalentClass> 
</owl:Class> 

<owl:Class rdf:about="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#ErgativeFrame"> 
    <owl:equivalentClass> 
     <owl:Restriction> 
      <owl:onProperty rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#hasAgent"/> 
      <owl:someValuesFrom rdf:resource="http://www.w3.org/2002/07/owl#Thing"/> 
     </owl:Restriction> 
    </owl:equivalentClass> 
    <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/gumaro/ontologies/2017/11/untitled-ontology-26#Frame"/> 
</owl:Class> 

、ここでは、の範囲を取得するためのコードですプロパティ:

 OntClass ontClass = ontModel.getOntClass(NS_OWL + "ErgativeFrame"); 
     List<OntClass> list = ontClass.listEquivalentClasses().toList(); 

     for (OntClass equiv: list) { 
      if (equiv.isRestriction()) {      
       OntProperty ontProperty = equiv.asRestriction().getOnProperty();           
       OntResource range = ontProperty.getRange(); 
       List<OntClass> rangeList = range.asClass().listEquivalentClasses().toList(); 
       for (OntClass rangeEquiv: rangeList) {; 
        for (OntClass rangeUnionClass: rangeEquiv.asUnionClass().listOperands().toList()) { 
         System.out.println("classes in union = " + rangeUnionClass); 
        } 
       } 

      } 
     } 

私は役立つことを望みます。

0

制限事項 '...#hasMainAction' + '...#ErgativeVerb'は、データプロパティまたはオブジェクトプロパティの存在数量制限(owl2 guideを参照)のいずれかになります。スニペットには、それが何であるかを判断する明示的な宣言はありません。

すべての制限は匿名リソース(クラス式)です。そのため、URIとローカル名は存在しません。

Jena-API(パッケージorg.apache.jena.ontology)は、OWL(-1)用であり、OWL-2用ではありません。純粋なOWLは時代遅れだと思われます。 OWL-2専用のorg.apache.jena.ontology.OntModelのjenaベースのアナログがあります。OntGraphModel。元の質問には直接関係していませんが、この場合はもっと便利です。ここでの例である:

String fullOwlAsString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + 
      "<rdf:RDF xmlns=\"http://www.semanticweb.org/owlapi/test#\"\n" + 
      "  xml:base=\"http://www.semanticweb.org/owlapi/test\"\n" + 
      "  xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" + 
      "  xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n" + 
      "  xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n" + 
      "  xmlns:owl=\"http://www.w3.org/2002/07/owl#\">" + 
      "<owl:Ontology rdf:about=\"#\" />" + yourSnippet + "</rdf:RDF>"; 
    InputStream in = new ByteArrayInputStream(fullOwlAsString.getBytes(StandardCharsets.UTF_8)); 
    OntGraphModel ont = OntManagers.createONT().loadOntologyFromOntologyDocument(in).asGraphModel(); 
    ont.ontObjects(OntCE.ObjectSomeValuesFrom.class).map(OntCE.Value::getValue) 
      .filter(OntCE.ComponentsCE.class::isInstance) 
      .map(OntCE.ComponentsCE.class::cast) 
      .flatMap(OntCE.Components::components) 
      .map(RDFNode.class::cast).filter(RDFNode::isResource).map(RDFNode::asResource).map(Resource::getLocalName) 
      .forEach(System.out::println); 

出力:

Animal 
Beverage 
BodyPart 
ClosedLocation 
Clothing 
Food 
Furniture 
NatureElement 
NaturePhenomenon 
OpenLocation 
Person 
Toy 
Transport 
Vegetal 
Animal 
Object 
Person 
関連する問題