get OWL restrictions on classes using Jena

后端 未结 2 1091
暖寄归人
暖寄归人 2021-01-01 00:52

Using the pizza ontology, I want to be able to look up all the toppings for American pizza. If I open the ontology in Protégé, I can see that American pizza has

2条回答
  •  一整个雨季
    2021-01-01 01:44

    Here's my solution. I've just printed out the strings you ask for, but hopefully you can see from this how to use the Jena OntAPI to traverse an ontology graph and pick out the things you're interested in.

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

    Which produces the following output:

    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}
    

提交回复
热议问题