2011-10-15 15 views

Respuesta

9

Aquí está mi solución. Acabo Imprimí las cuerdas que pide, pero es de esperar que puedo ver en este cómo utilizar el Jena OntAPI para atravesar un gráfico de la ontología y escoger las cosas que le interesan.

package examples; 
import java.util.Iterator; 
import com.hp.hpl.jena.ontology.*; 
import com.hp.hpl.jena.rdf.model.ModelFactory; 
import com.hp.hpl.jena.rdf.model.Resource; 

public class PizzaExample 
{ 
    /***********************************/ 
    /* Constants      */ 
    /***********************************/ 
    public static String BASE = "http://www.co-ode.org/ontologies/pizza/pizza.owl"; 
    public static String NS = BASE + "#"; 

    /***********************************/ 
    /* External signature methods  */ 
    /***********************************/ 

    public static void main(String[] args) { 
     new PizzaExample().run(); 
    } 

    public void run() { 
     OntModel m = getPizzaOntology(); 
     OntClass american = m.getOntClass(NS + "American"); 

     for (Iterator<OntClass> supers = american.listSuperClasses(); supers.hasNext();) { 
      displayType(supers.next()); 
     } 
    } 

    /***********************************/ 
    /* Internal implementation methods */ 
    /***********************************/ 

    protected OntModel getPizzaOntology() { 
     OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
     m.read(BASE); 
     return m; 
    } 

    protected void displayType(OntClass sup) { 
     if (sup.isRestriction()) { 
      displayRestriction(sup.asRestriction()); 
     } 
    } 

    protected void displayRestriction(Restriction sup) { 
     if (sup.isAllValuesFromRestriction()) { 
      displayRestriction("all", sup.getOnProperty(), sup.asAllValuesFromRestriction().getAllValuesFrom()); 
     } 
     else if (sup.isSomeValuesFromRestriction()) { 
      displayRestriction("some", sup.getOnProperty(), sup.asSomeValuesFromRestriction().getSomeValuesFrom()); 
     } 
    } 

    protected void displayRestriction(String qualifier, OntProperty onP, Resource constraint) { 
     String out = String.format("%s %s %s", 
            qualifier, renderURI(onP), renderConstraint(constraint)); 
     System.out.println("american pizza: " + out); 
    } 

    protected Object renderConstraint(Resource constraint) { 
     if (constraint.canAs(UnionClass.class)) { 
      UnionClass uc = constraint.as(UnionClass.class); 
      // this would be so much easier in ruby ... 
      String r = "union{ "; 
      for (Iterator<? extends OntClass> i = uc.listOperands(); i.hasNext();) { 
       r = r + " " + renderURI(i.next()); 
      } 
      return r + "}"; 
     } 
     else { 
      return renderURI(constraint); 
     } 
    } 

    protected Object renderURI(Resource onP) { 
     String qName = onP.getModel().qnameFor(onP.getURI()); 
     return qName == null ? onP.getLocalName() : qName; 
    } 
} 

que produce la salida siguiente:

american pizza: some pizza:hasTopping pizza:MozzarellaTopping 
american pizza: some pizza:hasTopping pizza:PeperoniSausageTopping 
american pizza: some pizza:hasTopping pizza:TomatoTopping 
american pizza: all pizza:hasTopping union{ pizza:MozzarellaTopping pizza:TomatoTopping pizza:PeperoniSausageTopping} 
0

ahora (con 3.xx Apache-jena) hay un posible problema con org.apache.jena.ontology.OntModel y pizza.owl en que Jena-Ont-API es compatible del búho 1 solo, mientras que la pizza es ontología OWL-2. Aunque, para el ejemplo anterior, no importa (las restricciones de "cuantificación existencial" son idénticas tanto para OWL1 como para OWL2), en general, no puede usar OntModel para procesar la ontología con la misma facilidad. Como opción existe una alternativa OntModel llamada ru.avicomp.ontapi.jena.model.OntGraphModel de ont-api. Se basa en los mismos principios que jena OntModel. Quizás sería útil para alguien.

Un ejemplo de uso (conseguir único objeto-algunas-valores-de restricciones):

String uri = "http://www.co-ode.org/ontologies/pizza/pizza.owl"; 
    String ns = uri + "#"; 

    OntGraphModel m = ru.avicomp.ontapi.jena.OntModelFactory.createModel(); 
    try (InputStream in = ExamplePizza.class.getResourceAsStream("/pizza.ttl")) { 
     m.read(in, uri, "ttl"); 
    } 
    ru.avicomp.ontapi.jena.model.OntClass clazz = m.getOntEntity(OntClass.class, ns + "American"); 
    OntNOP prop = m.getOntEntity(OntNOP.class, ns + "hasTopping"); 
    clazz.subClassOf() 
      .filter(c -> c.canAs(OntCE.ObjectSomeValuesFrom.class)) 
      .map(c -> c.as(OntCE.ObjectSomeValuesFrom.class)) 
      .filter(c -> prop.equals(c.getOnProperty())) 
      .map(OntCE.Value::getValue) 
      .forEach(System.out::println); 

de salida:

http://www.co-ode.org/ontologies/pizza/pizza.owl#PeperoniSausageTopping(OntClass) 
http://www.co-ode.org/ontologies/pizza/pizza.owl#TomatoTopping(OntClass) 
http://www.co-ode.org/ontologies/pizza/pizza.owl#MozzarellaTopping(OntClass) 
Cuestiones relacionadas