Jena

2011-10-15 13 views
6

kullanarak sınıflarda OWL kısıtlamaları olsun pizza ontology kullanarak, American pizza için tüm Topingler bakmak mümkün olmak istiyorum.Jena

hasTopping some MozerellaTopping 
hasTopping some TomatoTopping 

nasıl Jena aracılığıyla aynı bilgileri programlama yoluyla alabilirsiniz: Ben Protege içinde ontolojisi açarsanız , ben American bir pizza aşağıdaki kısıtlamaları sahip olduğunu görebiliyoruz?

cevap

9

İşte benim çözümüm. Sadece sormak dizeleri çıktısı ettik ama umarım ilgilendiğiniz şeyleri bir ontoloji grafiğini çapraz ve dışarı almak için Jena OntAPI nasıl kullanılacağı bu görebilirsiniz.

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

üretir Hangi aşağıdaki çıkışı: (Apache-jena 3.xx ile) Şimdi

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

o Jena-Ont-API olası org.apache.jena.ontology.OntModel sorun ve pizza.owl var OWL- destekler Sadece 1, pizza ise OWL-2 ontolojisidir. olsa da, önemli değil yukarıdaki örneğin genel durumda aynı kolaylıkla ontolojisi işlemek için OntModel kullanamaz ('Varoluşçu Niceleme' kısıtlamalar aynı hem OWL1 ve owl2 arar). Bir seçenek olarak ont-api'dan itibaren ru.avicomp.ontapi.jena.model.OntGraphModel adlı bir OntModel-alternatifi vardır. Jena OntModel ile aynı prensiplere dayanmaktadır. Belki birisi için yararlı olur.

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

Giren:

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) 

kullanımının bir örneği

(sadece nesne bir değer çiftlerini-kısıtlamaları alma)