2010-06-11 22 views
6
InfModel infmodel = ModelFactory.createInfModel(reasoner, m); 
Resource vegetarian = infmodel.getResource(source + "Vegetarian"); 
Resource margherita = infmodel.getResource(source + "Example-Margherita"); 
if (infmodel.contains(margherita, RDF., vegetarian)) { 
     System.out.println("Margherita is a memberOf Vegetarian pizza"); 
    } 

El ejemplo dado anteriormente está formado por pizza.owl formal. En este búho, Ejemplo-Margherita es un individuo de la clase Margherita. Por lo tanto, ya está escrito en el archivo owl. Sin embargo, el problema es que el razonador debería inferir que margherita-example debería ser también una pizza vegetariana. ¿Podría alguien dar un ejemplo que muestre cómo encontrar las posibles clases inferidas de un individuo como en Protege? (Protege deduce correctamente ese ejemplo: Margherita es una pizza vegetariana. Sin embargo, no puedo inferir programáticamente)Inferring usando Jena

+0

Sería de gran ayuda si se incluye un puntero al archivo pizza.owl (supongo que es un lugar público) y si también ha proporcionado el código que utilizó para configurar la variable 'reasoner'. – cygri

+0

Muchas gracias cygri por su interés. Resolví mi problema y proporcioné un ejemplo a continuación. – Mikae

Respuesta

9

Resolví mi pregunta. Creo que hubo un problema con mi ontología. Por lo tanto, creé otra ontología para inferir individuos. La ontología que creé contiene Persona y subclases de Persona: MalePerson, FemalePerson y MarriedPerson. Y, hay dos propiedades de objeto (hasSpouse, hasSibling) y una propiedad de tipo de datos (hasAge). Y, creé 3 personas. John - MalePerson - tieneEdad (20) - tieneHermano (Jane) Jane - FemalePerson - tieneHermano (Juan) - tieneCónyuge (Bob) Bob - MalePerson - tieneCónyuge (Jane)

Y, puse dos restricciones para MalePerson y Clases de FemalePerson Para MalePerson: tieneCónyuge máximo 1 tieneCónyuge única MalePerson Para FemalePerson: tieneCónyuge máximo 1 tieneCónyuge única FemalePerson

Por último, he hecho MarriedPerson ser una clase definida. Antes de razonar, MarriedPerson no tiene ningún individuo. Sin embargo, la modelo debería inferir que Jane y Bob están casados. Por lo tanto, al final, la clase MarriedPerson debe tener 2 personas.

Cuando ejecuté este código en Java usando Jena, obtuve 2 individuos inferidos.

OntModel ontModel = ModelFactory.createOntologyModel(); 
    InputStream in = FileManager.get().open(inputFileName); 
    if (in == null) { 
     throw new IllegalArgumentException("File: " + inputFileName + " not found"); 
    } 
    ontModel.read(in, ""); 


    Reasoner reasoner = ReasonerRegistry.getOWLReasoner(); 
    reasoner = reasoner.bindSchema(ontModel); 
    // Obtain standard OWL-DL spec and attach the Pellet reasoner 
    OntModelSpec ontModelSpec = OntModelSpec.OWL_DL_MEM; 
    ontModelSpec.setReasoner(reasoner); 
    // Create ontology model with reasoner support 
    OntModel model = ModelFactory.createOntologyModel(ontModelSpec, ontModel); 

    // MarriedPerson has no asserted instances 
    // However, if an inference engine is used, two of the three 
    // individuals in the example presented here will be 
    // recognized as MarriedPersons 
      //ns is the uri 
    OntClass marPerson = model.getOntClass(ns + "OWLClass_00000003866036241880"); // this is the uri for MarriedPerson class 
    ExtendedIterator married = marPerson.listInstances(); 
    while(married.hasNext()) { 
     OntResource mp = (OntResource)married.next(); 
     System.out.println(mp.getURI()); 
    } // this code returns 2 individuals with the help of reasoner 
+0

Gracias Mikae! ¡Muy útil! Sería genial si pudieras incluir tus archivos OWL & Turtle también :-) –

+0

¿Alguien sabe cómo extender esto con las propias reglas cargadas desde un archivo? – Macilias