2011-10-15 12 views

risposta

9

Ecco la mia soluzione. Ho appena stampato fuori le corde si chiede per, ma spero che si può vedere da questo come utilizzare il Jena OntAPI per attraversare un grafico ontologia e scegliere le cose che ti interessa.

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; 
    } 
} 

che produce il seguente risultato:

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

Ora (con 3.xx Apache-Jena) c'è un problema possibile con org.apache.jena.ontology.OntModel e pizza.owl dal fatto che Jena-Ont-API supporta OWL- 1 solo, mentre la pizza è l'ontologia OWL-2. Anche se, per l'esempio precedente, non ha importanza (le restrizioni 'Quantificazione Esistente' sono identiche sia per OWL1 che per OWL2), in generale non è possibile utilizzare OntModel per elaborare l'ontologia con la stessa facilità. Come opzione esiste un'alternativa di OntModel chiamata ru.avicomp.ontapi.jena.model.OntGraphModel da ont-api. Si basa sugli stessi principi di jena OntModel. Forse sarebbe utile per qualcuno.

Un esempio di utilizzo (ottenendo unico oggetto-alcuni-valori-da restrizioni):

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); 

Out:

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) 
Problemi correlati