【问题标题】:get OWL restrictions on classes using Jena使用 Jena 获得对类的 OWL 限制
【发布时间】:2011-10-15 18:51:56
【问题描述】:

使用pizza ontology,我希望能够查找American 披萨的所有配料。 如果我在Protégé中打开本体,可以看到Americanpizza有如下限制:

hasTopping some MozerellaTopping
hasTopping some TomatoTopping

如何通过 Jena 以编程方式获取相同的信息?

【问题讨论】:

    标签: java rdf jena owl


    【解决方案1】:

    这是我的解决方案。我刚刚打印出您要求的字符串,但希望您能从中了解如何使用 Jena 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;
        }
    }
    

    产生以下输出:

    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}
    

    【讨论】:

      【解决方案2】:

      对于 Apache Jena 3.x.x(以及 2.x),存在一个与 org.apache.jena.ontology.OntModelpizza.owl 相关的潜在问题:Jena 仅支持 OWL1,但 Pizza 是 OWL2 本体。

      Ans,虽然,对于上面的示例,这并不重要(OWL1 和 OWL2 的“存在​​量化”限制看起来相同,并且 Jena API 可以处理它), 在一般情况下,您不能使用org.apache.jena.ontology.OntModel 来轻松处理本体。

      作为一个选项,ONT-API 中有一个名为 com.github.owlcs.ontapi.jena.model.OntModel 的替代选项。 该模型基于与 Jena OntModel 相同的原理,但它非常适用于 OWL2(而且,它不是 InfModel - 在撰写本文时)。

      考虑一个使用示例(类的object-some-values-from限制):

          String web = "https://raw.githubusercontent.com/owlcs/ont-api/master/src/test/resources/ontapi/pizza.ttl";
          // create an OWL2 RDF-view (Jena Model):
          OntModel m = com.github.owlcs.ontapi.jena.OntModelFactory.createModel();
          // load pizza ontology from web
          m.read(web, "ttl");
          // find class and property
          OntClass clazz = m.getOntClass(m.expandPrefix(":American"));
          OntObjectProperty prop = m.getObjectProperty(m.expandPrefix(":hasTopping"));
          // list and print all some values from restrictions with desired property
          clazz.superClasses()
                  .filter(c -> c.canAs(OntClass.ObjectSomeValuesFrom.class))
                  .map(c -> c.as(OntClass.ObjectSomeValuesFrom.class))
                  .filter(c -> prop.equals(c.getProperty()))
                  .map(x -> x.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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多