2017-04-24 1 views
0

J'essaye d'analyser le fichier OWL2 en utilisant l'API OWL. Mais j'ai un problème quand j'essaye d'analyser l'étiquette <SubClassOf></SubClassOf>. S'il vous plaît voir l'exemple ci-dessous.Le contenu analysé est dans l'ordre inverse


<?xml version="1.0"?> 

<Ontology xmlns="http://www.w3.org/2006/12/owl2-xml#" 
    ......> 
    <SubClassOf> 
     <Class URI="&ontology_people1;Address"/> 
     <Class URI="&ontology_people1;Location"/> 
    </SubClassOf> 
    ...... 
</Ontology> 

Le contenu entre <SubClassOf> and </SubClassOf> sont écrites dans l'ordre. La classe enfant est écrite sur la première ligne et la classe parente est écrite sur la deuxième ligne. Mais je l'analyse et imprime dans la console. Leur ordre est inverse. Pendant ce temps, les autres ne sont pas inverses. Mon code est sur le dessous.


OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 

     File file = new File("src/main/resources/dataSet/PR/person1/ontology_people1.owl"); 

     OWLOntology o = manager.loadOntologyFromOntologyDocument(file); 
List<OWLAxiom> subClassOf = o.axioms() 
       .filter(axiom -> axiom.getAxiomType().toString().equals("SubClassOf")) 
       .collect(Collectors.toList()); 

     for (OWLAxiom owlAxiom : subClassOf) { 

      Stream<OWLEntity> owlEntityStream = owlAxiom.signature(); 
      owlEntityStream.forEach(entity->System.out.println(entity.getIRI())); 
      System.out.println("**************"); 
     } 

Pourquoi?

+0

@Ignazio Excusez-moi, vous me avez aidé plusieurs fois, et je sais que vous êtes l'auteur de l'API OWL, pouvez-vous me aider à nouveau ? Je vous remercie ! – ciferlv

Répondre

1

C'est parce que la méthode signature() n'est pas ce que vous devez utiliser. La signature d'un axiome est l'ensemble des entités apparaissant dans cet axiome, et est défini indépendamment du type d'axiome. La caractéristique principale, dans ce cas, étant que l'ordre des entités dans une signature n'a rien à voir avec la sémantique de l'axiome.

Pour accéder à sous-classes de manière fiable et superclasses, utilisez le code comme ceci:

List<OWLSubClassOfAxiom> subClassOf = OWLAPIStreamUtils.asList(o.axioms(AxiomType.SUBCLASS_OF)); 
    subClassOf.forEach(x->{ 
     System.out.println(x.getSubClass()); 
     System.out.println(x.getSuperClass()); 
     }); 
+0

Merci beaucoup! – ciferlv