2011-10-15 2 views
6

pizza ontologyを使用して、Americanピザのすべてのトッピングをルックアップできます。私はプロテジェでオントロジーを開くと 、私はAmericanピザは、以下の制限があることを見ることができます。Jenaを使用したクラスのOWL制限を取得する

hasTopping some MozerellaTopping 
hasTopping some TomatoTopping 

は、どのように私はイエナを通じてプログラム的に同じ情報を得ることができますか?

答えて

9

私の解決策です。私はちょうどあなたが求める文字列をプリントアウトしましたが、願わくはあなたが興味のあるものをオントロジーグラフを横断し、選ぶためにイエナONTAPIを使用する方法をここから見ることができます。

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

を生成します次の出力:(アパッチ・イエナ3.xxのと)今

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

そのイエナ・オンタリオ-APIにおける一つの可能​​org.apache.jena.ontology.OntModelに問題とpizza.owlがあるがOWL-をサポートしています1のみ、ピザはOWL-2オントロジーである。 しかし、上の例では( 'Existential Quantification'の制限はOWL1とOWL2の両方で同じに見えますが)、一般的にはOntModelをオントロジーと同様に簡単に処理することはできません。 オプションとして、ont-apiのru.avicomp.ontapi.jena.model.OntGraphModelという名前のOntModel代替があります。それはjena OntModelと同じ原則に基づいています。たぶんそれは誰かのために役立つだろう。

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

アウト:

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) 

使用例

は(唯一オブジェクト-いくつかの値-から制限を取得します)