Saltar al contenido

Gestiona ontologías con Jena

10 May 2010

En esta entrada veremos, mediante ejemplos muy simples, cómo podemos gestionar nuestra ontología con Jena. Los puntos que abordaremos serán: 1. Crear una ontología desde cero con la API de Jena, 2. Leer datos de una ontología, 3. Escribir datos en la ontología y 4.Cargar una ontología previamente creada.

Usaremos la versión 2.6.2 de Jena, disponible en su web oficial.

Empecemos…

Conceptos iniciales

Durante esta entrada vamos a manejar una serie de conceptos, que creo que es conveniente describir un poco, para que nadie se pierda y pueda seguir el hilo fácilmente.

En primer lugar usaremos el término «Clase«. Una Clase será un conjunto de conceptos relacionados jerarquicamente que nos permitirá identificar y clasificar elementos de un dominio de forma concisa y concreta. Podemos pensar en las clases de una ontología como las clases de un diseño de POO (Programación Orientada a Objetos). La gran diferencia es que nuetra ontología tendrá un significado semántico que no tendrá nuestro diseño de clase de POO. Por supuesto una clase tendrá subclases, superclases, clases hermanas, …, todo lo relacionado con la herencia. Toda ontología tiene siempre una clase base de la que parten todas las demás. (owl:Thing)

Usaremos el término «Instancia«. Una instancia será una representación concreta de una clase. Una instancia quedará identificada y definida por la clase a la que pertenezca y por toda la jerarquía de clase que haya por encima. Además, una instancia definirá valores concretos para todas las propiedades que tenga la clase a la que pertenece.

Aquí entra en juego otro término. «Propiedades«. Las propiedades son la forma de asignar más contenido a una clase. Por tanto, las propiedades se definen a nivel de clase. Hay tres tipos básico de propiedades: 1. Propiedades de objeto: Su valor es un objeto (Instancia) de la ontología, 2. Propiedades de Datos: Su valor es un dato de tipo primitivo (int, float, string,…) y 3. Propiedades de Anotación: Sirven para escribir anotaciones y descripciones en lenguaje natural.

No vamos a ver ningún tipo de restricción lógica en esta entrada, ya que el objetivo es mostrar una breve introducción a Jena y establecer algunos conceptos más básicos y útiles. Bueno, creo que con estos conceptos en mente, podemos empezar a ver algo de código. Usaremos el lenguaje Java.

1. Crear una ontología

Lo primero para crear una ontología es documentarnos mucho y a fondo, sobre el dominio en el que vamos a movernos. Las ontologías deben ser lo más detalladas posible, no debe haber lugar a duda. Debemos ser capaces de identificar inequívocamente un elemento (Instancia) en cualquier momento. No debe haber posibilidad de confusión a la hora de obtener información de una instancia.

Nosotros, en esta entrada, vamos a trabajar con una ontología muy sencilla y muy simple, que nos servirá a modo de ejemplo. Nuestro dominio serán los Animales. Dividiremos a los animales en dos grupos: Vertebrados e Invertebrados. Por tanto, tendremos una clase base que será Animales y dos subclases que serán Vertebrados e Invertebrados. La clase Animales, será una clase abstracta, no podrá tener instancia directas. De esta forma «obligamos» a que cualquier animal que forme parte de nuestra jerarquía sea Vertebrado o Invertebrado. Por supuesto Vertebrado e Invertebrado serán clases disjuntas: los animales que pertenezca a una, no podrán pertenecer a la otra.

La clase Animales tendrá una propiedad de tipo int, que será Peso, por tanto sus subclases, heredarán esta propiedad. Además crearemos cuatro instancias: Pulpo y Sepia (Invertebrados) y León y Leopardo (Vertebrados).

Es un ejemplo muy sencillo, hecho a modo de inicio, sin mayores pretensiones.

//Creamos nuestro modelo
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);

//Establecemos el NameSpace por defecto para nuestra ontología
String NS = "animales";
model.setNsPrefix(NS, "http://www.owl-ontologies.com/OntologyAnimals.owl");

Ya tenemos nuestro modelo vacío y listo para contener una ontología en lenguaje OWL y almacenarla en memoria principal. Lo siguiente será comenzar a crear nuestras clases, propiedades e instancias. El NameSpace es necesario para obtener una URI absoluta de cada elemento de la ontología. La dirección http que aparece en el ejemplo es inventada.

Vamos a crear las clases, las propiedades y las instancias:

//Clases. Hay que crearlas con el NameSpace definido
OntClass animales = model.createClass(NS+":"+"Animales");
OntClass vertebrados = model.createClass(NS+":"+"Vertebrados");
OntClass invertebrados = model.createClass(NS+":"+"Invertebrados");

vertebrados.setDisjointWith(invertebrados);
animales.addSubClass(vertebrados);
animales.addSubClass(invertebrados);

//Creamos la propiedad peso
DatatypeProperty peso = model.createDatatypeProperty(NS+":"+"Peso");
peso.addDomain(animales);//Clase a la que pertenece
peso.addRange(XSD.xint);//Tipo de la propiedad
peso.convertToFunctionalProperty();//Para que solo acepte un valor.

//Creamos las instancias y damos valor a la propiedad Peso
Individual leon = model.createIndividual(NS+":"+"Leon",vertebrados);
leon.setPropertyValue(peso, model.createTypedLiteral(250));

Individual leopardo = model.createIndividual(NS+":"+"Leopardo",vertebrados);
leopardo.setPropertyValue(peso, model.createTypedLiteral(200));

Individual pulpo = model.createIndividual(NS+":"+"Pulpo",invertebrados);
pulpo.setPropertyValue(peso, model.createTypedLiteral(10));

Individual sepia = model.createIndividual(NS+":"+"Sepia",invertebrados);
sepia.setPropertyValue(peso, model.createTypedLiteral(1));

//Almacenamos la ontología en un fichero OWL (Opcional)
File file = new File("/Users/Rekkeb/Desktop/Animales.owl");
//Hay que capturar las Excepciones
if (!file.exists()){
     file.createNewFile();
}
model.write(new PrintWriter(file));

2. Leer datos de la ontología

Llegados a este punto, ya tenemos nuestra ontología de Animales creada y almacenada en un fichero OWL en nuestro disco duro. Lo siguiente que vamos a hacer es recorrer las clases que tiene nuestra ontología y mostrar las instancias que tiene cada clase. Para ello haremos uso de los Iteradores.

//Recorremos la ontologia
for (Iterator<OntClass> i = model.listClasses();i.hasNext();){
	OntClass cls = i.next();
	System.out.print(cls.getLocalName()+": ");
	for(Iterator it = cls.listInstances(true);it.hasNext();){
		Individual ind = (Individual)it.next();
		if(ind.isIndividual()){
			System.out.print(ind.getLocalName()+" ");
		}
	}
	System.out.println();
}

3. Escribir datos en la ontología

Vamos a ver cómo podemos cambiar el valor de la propiedad peso para cualquier instancia. Si queremos añadir nuevas instancias o nuevas propiedades, simplemente tendremos que seguir los pasos del punto 1.

Para cambiar el valor de la propiedad «Peso» de cualquier instancia, simplemente debemos hacer lo siguiente:

//Obtenemos la instancia y la propiedad y le damos un nuevo valor
model.getIndividual(NS+":"+"Leon")
              .setPropertyValue(model.getProperty(NS+":"+"Peso"),
                                           model.createTypedLiteral(255));

4. Cargar una ontología previamente creada

Para cargar una ontología que tengamos previamente almacenada en el disco duro (en un fichero OWL), debemos simplemente utilizar el método read() de la clase OntModel. A este método debemos pasarle por parámetro una URI absoluta y bien construida que contenga la ruta al fichero en disco. Bueno, en realidad tenemos que pasarle un String que contenga una URI absoluta.

Simplemente sería:

OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
model.read("file:///Users/Rekeb/Desktop/Animales.owl","RDF/XML");

Y listo, a trabajar con nuestra ontología.

Más info

Jena | Web Oficial

API Jena | http://jena.sourceforge.net/javadoc/index.html

ProtegeOWL API | Crear una Ontología con ProtegeOWL API

67 comentarios leave one →
  1. julia permalink
    14 febrero 2011 20:41

    Hola, necesito ayuda en esto de las onlogías! ya tengo la ontología dentro de ide netbeans y me muestra las clases y subclases de mi ontología pero deseo saber como hacer para acceder y gestionar las propiedades simples y a las relaciones

    GRACIAS!

    • rekkeb permalink*
      14 febrero 2011 22:49

      Hola julia, para acceder a las propiedades, es muy sencillo:

      for (Iterator i = model.listAllOntProperties();i.hasNext();){
      OntProperty p = (OntProperty)i.next();
      System.out.println(p.getLocalName());
      }

      Con eso listas todas las propiedades sin importar el tipo. Si te interesa procesar la propiedad dependiendo del tipo, la clase OntProperty tiene métodos del tipo isXXX() que te permiten gestionar las propiedades dependiendo de su tipo: DataType, DataRange, Annotation, etc…
      Por ejemplo:
      if(p.isDatatypeProperty()){
      DatatypeProperty dtp = p.asDatatypeProperty();
      //y así accedes a los métodos de la propiedad de tipo Datatype
      }

      Y con respecto al tema de las relaciones, no entiendo bien a que te refieres exactamente: relaciones entre clases??? Estas suelen venir representadas como ObjectProperty….. if (p.isObjectProperty())…

      • Julia permalink
        25 febrero 2011 19:56

        Muchas gracias ¡Rekkeb! que esto me esta costando mucho jajaja pero parece ya va tomando forma!!

  2. Julia permalink
    7 abril 2011 18:48

    Hola!!! que tal??? moletando de nuevo… tengo una duda sobre como visualizar las propiedades de las instancias creadas en mi ontología!!! no encuentro la manera utilizando la api de jena, he leido un poco sobre sparql para realizar las consultas pero soy extremadamente nueva! en estos temas je…

  3. Julia permalink
    7 abril 2011 18:53

    jaja buscando regrese a de nuevo a tu blog y creo mi pregunta es confunsa, ya converti las instancias a individuos y obtengo el nombre de cada una de ellas lo que me hace falta es mostrar los datos almacenados con el identificador de mi instancia..

    • rekkeb permalink*
      9 abril 2011 12:22

      Hola Julia, hay dos formas (que yo conozca) para obtener las propiedades de una instancia.
      1. Consiste en recorrer todas las propiedades de la ontología e ir preguntando 1 a 1 si tu Individual dispone de esa propiedad
      2. Listar las propiedades directamente desde el Individual
      Cada una de las opciones tiene sus ventajas e incovenientes. Te muestro como se haría en cada caso suponiendo que ya tenemos un objeto Individual (indiv):
      1.
      //Recorrer todas las propiedades de la ontología
      for (Iterator it<OntProperty> = model.listAllOntProperties();it.hasNext();){
      OntProperty pit = it.next();
      if (indiv.hasProperty(pit)){
      System.out.println(«Valor de «+pit.getLocalName()+»: «+indiv.getPropertyValue(pit).asLiteral().getValue());
      }
      }

      2.
      for (Iterator it = indiv.listProperties();it.hasNext();){
      Property pit = ((StatementImpl)it.next()).getPredicate();
      System.out.println(«Valor de «+pit.getLocalName()+»: «+(indiv.getPropertyValue(pit).isLiteral()?indiv.getPropertyValue(pit).asLiteral().getValue() : indiv.getPropertyValue(pit).toString()));
      }

  4. neyda permalink
    7 abril 2011 22:30

    Hola he leido en alguna bibliografia que las clases de las ontologias pueden ser o no abstractas hay alguna funcion de jena que permita conocer esta caracteristica.
    gracias

    • rekkeb permalink*
      9 abril 2011 12:16

      Hola neyda. Efectivamente las clases en una ontología pueden ser abstractas (no permiten tener instancias directas) o ser concretas. En terminología de OWL las clases abstractas dejan de tener sentido debido a la «Open World Assumption» que conlleva OWL. Por ejemplo no tendría sentido marcar la clase Animal como abstracta e impedir que tenga instancias, sabiendo que para OWL cualquier instancia de una subclase es a su vez instancia de la clase base.
      Por esta razón las clases de una ontología OWL dejan de marcarse como abstractas. De hecho en Protégé, cuando creas una ontología OWL no hay ninguna opción directa para marcar una clase como abstracta.
      Si te das cuenta, aunque en el ejemplo supongo que Animal es una clase Abstracta, realmente para OWL no es así, ya que cualquiera de las instancias que hemos creado: Pulpo por ejemplo, será también subclase de Animal.

  5. Yanet permalink
    20 julio 2011 19:31

    Hola, necesito saber si me podrias ayudar , estoy bucando como saber si las instancias de una ontologias tienen propiedades cuyos valores hagan referencia a su posicion geografica.
    Gracias

  6. 15 agosto 2011 20:31

    Hola disculpa me surgio una duda mientras ponia en marcha los ejemplos que planteas, y bueno el caso es que tengo mi ontologia .owl y ya la pude cargar y ver las clases y subclases usando jena, pero las instancias van a ser de una base de datos enotnces quiero saber como puedo hacer eso ya sea pasar la base de datos a la ontologia o viceversa y siendo eso como puedo hacer consultas en la misma, eh leido algo sobre SPARQL pero tengo dudas de como usarlo, te agradeceria mucho tu ayuda.

    • rekkeb permalink*
      16 agosto 2011 19:25

      Hola. Lo que comentas es algo muy usual, de hecho yo lo he hecho en algún proyecto y no es nada complicado. Lo que tienes que tener claro para empezar es: ¿La base de datos va a almacenar toda la ontología o sólo te interesa almacenar en esa bbdd cierta información que después se transformará en instancias de la ontología?

      Por qué digo esto? Jena tiene la habilidad de dotar a las ontologías de almacenamiento persistente. Puede hacerlo mediante un fichero en disco (.owl o .rdf por ejemplo) o bien puede hacerlo en una base de datos mediante la API JDBC.

      Llegados aquí tendríamos dos posibilidades:
      1. Nuestra bbdd sólo almacena información sobre las instancias: En este paso debemos crear un método propio para mapear esa información almacenada en la base de datos y convertirla en información que nuestra ontología entienda (OWLIndividual, Instance, etc…). Es importante que el método que va a mapear la información sepa relacionar cada fila de la tabla en la bbdd con cada clase de nuestra ontología. (Esto ya es a elección del desarrollador)
      2. Nuestra bbdd almacenará toda la ontología: En este paso simplemente deberemos asegurarnos de tener una bbdd vacía y dejar que Jena haga todo el trabajo. Si utilizamos el sistema de persistencia en bbdd de jena, se crearán automáticamente todas las tablas necesarias con las relaciones que se requieran. Nosotros desde código simplemente le diremos que lea nuestra ontología de la bbdd y que la guarde nuevamente…

      Cualquiera de las dos opciones es válida. La primera opción tiene la ventaja de que tú como desarrolladora tienes el control sobre las estructuras de información que manejas (tu ontología y tu bbdd) y la segunda tiene la ventaja de la ‘comodidad’.

      Con respecto a SPARQL, decirte que es un lenguaje de consulta para tripletas RDF. Su sintaxis es muy similar a SQL (aunque bastante diferente en algunas ocasiones) y efectivamente sirve para realizar consultas sobre ontologías y obtener cierta información como harías sobre una base de datos. Aquí: http://www.w3.org/TR/rdf-sparql-query/ tienes la documentación oficial de SPARQL y también algunos ejemplos que te ayudarán a comprender la sintaxis…todo es práctica. Al principio es un poco ambiguo y extraño pero una vez que dominas un par de sentencias…está hecho 😉

      • NHL permalink
        6 abril 2019 01:05

        rekkeb , muy buen blog.
        Estoy comenzando un proy con ontologías y quiero persistir la totalidad de la misma en un motor de base de datos de mysql.
        Desde java utilizando jena, creo la conexión a la base, pero no logro que jena me persista la ontología a partir de un archivo generado con protege.
        Me puedes ayudar? Muchas gracias

  7. 9 septiembre 2011 13:16

    Hola, gracias por el post. Te escribo porque tengo una ontologia cargada y una regla en jena que quiero aplicarla a dicha ontología y tras hacer lo del siguiente codigo me imprime por pantalla el codigo RDF de mi propio owl mientras que lo que yo quiero obtener es el resultado de aplicar la regla sobre la ontología. ¿que hago mal o que me falta x hacer?
    Model model = ModelFactory.createOntologyModel();

    //create a resource (empty resource)
    Resource configuration = model.createResource();

    //set engine mode
    configuration.addProperty(ReasonerVocabulary.PROPruleMode, «hybrid»);

    //set the rules file
    configuration.addProperty(ReasonerVocabulary.PROPruleSet, «rules/miregla.rules»);

    // Create an instance of such a reasoner
    Reasoner reasoner = GenericRuleReasonerFactory.theInstance().create(configuration);

    // Load RDF test data
    model=FileManager.get().loadModel(«data/CaidasEnAltura.owl»);

    /* Ahora con el rawdata model y con el reasoner creamos un InfModel. attach reasoner to model */
    InfModel infModel = ModelFactory.createInfModel(reasoner, model);
    //InfModel infModel = ModelFactory.createInfModel(reasoner, oOntCaidasEnAltura);

    //force starting the rule execution
    infModel.prepare();

    //write down the results in RDF/XML form
    infModel.write(System.out);

  8. Juan permalink
    30 septiembre 2011 10:34

    Hola

    hablando de gestionar ontologias con Jena , atraves de la api, se podria escribir codigo que instancie una ontologia existente mirando en dbpedia???????

    Saludos

    • rekkeb permalink*
      30 septiembre 2011 20:06

      Vaya, no conocíá dbpedia…gracias por el aporte!
      Conociendo la URL de una ontología, puede realizarse un Import y a partir de ahí, tendrías acceso a sus elementos. Imagino que con las dbpedia también será posible.
      😉

      • Juan permalink
        8 diciembre 2011 16:51

        Y si la ontologia la hemos creado con por ejemplo protege????? podemos instanciarla con cualquier uri????.

  9. 2 octubre 2011 01:56

    Hola interesante aporte, muchas gracias.
    Necesito desarrollar un sistema tutor inteligente e investigando encontre que puedo utilizar ontologias, de casualidad tienes algun documento o sitio que pudiereas recomendarme.
    De antemano muchas gracias.

    Saludos

    • rekkeb permalink*
      9 octubre 2011 09:21

      Hola clemus. La verdad es que literatura sobre ontologías hay mucha en internet. Cualquier sistema que necesite disponer de habilidades «inteligentes» sin duda debería utilizar las ontologías ya que son las estructuras perfectas para tal fin.
      Yo te recomiendo que, dependiendo del sistema tutor que quieras realizar, busques artículos científicos en los que traten un tema similar o aproximado al tuyo, ya que así obtendrás ideas y métodos que quizás ni hayas pensado en ellos y que aportarán un valor extra a tu Tutor Inteligente.
      En la web de Protégé hay mucha documentación sobre ontologías y lenguaje de reglas que te puede ser útil. Además la Wikipedia también es un buen punto de partida.

      Ánimo con ese sistema!!! Y cualquier duda que tengas, no dudes en consultarla.

      Salu2!!

  10. Yanet permalink
    2 octubre 2011 19:14

    Hola
    Estoy intentando por primera vez almacenar una ontologia en una base de datos pero solo necesito guardar la informacion referente a las instancias. Te escribo para saber si me podrias ayudar. Quiza con algun ejemplo.
    Agradeceria mucho tu ayuda.

    • rekkeb permalink*
      9 octubre 2011 09:16

      Hola Yanet. Lo que propones es una práctica muy común dentro del mundo de las ontologías. Suele ser muy habitual mantener una ontología que contenga la estructura y taxonomía del conocimiento y almacenar las instancias en otro tipo de estructura de almancenamiento como pueden ser las bases de datos. Yo personalmente haría algo parecido a lo siguiente, te pongo un ejemplo muy simple por si te sirve de base o de inspiración:
      – Para almacenar una instancia de una ontología en una base de datos, necesitamos almacenar también todas sus propiedades, los valores de cada propiedad y por supuesto la clase de la ontología a la que pertenece la instancia.
      – Vamos a necesitar generar una estructura de bases de datos que dé soporte a estas necesidades.
      Para ello, una opción es crear diversas tablas relacionadas que mantengan la información que necesitamos:
      1- Tabla con información de la instancia en sí: Nombre_Instancia (PK), Clase_Ont, Descripción,…
      2- Tabla que almacene propiedades y valores: Esta tabla tendrá una relación n:m con la tabla de instancias de forma que la tabla podría contener las siguientes columnas: Nombre_Propiedad (PK,FK), Nombre_Instancia (PK, FK), Valor
      3- Tabla de propiedades en la que almacenemos: Nombre_Propiedad (PK), Tipo_Propiedad, Descripción, …
      4- Si tuviéramos restricciones o anotaciones, podríamos seguir una estrategia similar a lo mencionado en los puntos anteriores.

      Con esta simple base, podríamos mantener la información necesaria para almacenar los datos necesarios de cada instancia de nuestra ontología. Es un simple ejemplo que puede (y debería) mejorarse y ampliarse dependiendo de las necesidades de la ontología y de los requisitos de cada aplicación en concreto.

      Espero que te sirva de algo. 😉

  11. Yanet permalink
    17 octubre 2011 20:04

    Disculpa no haberte agradecido antes pero es que soy estudiante y la cuenta de internet que me dan dura muy poco.
    Muchas gracias por la ayuda me sirvio de mucho, aun no he terminado el proyecto pero ya casi tengo lista la base de datos con toda la informacion que necesito.

    Saludos y gracias nuevamente.

    • rekkeb permalink*
      17 octubre 2011 22:24

      No hay porque agradecer, no te preocupes 😉

      Ánimo con ese proyecto!

  12. Victor Hugo permalink
    20 octubre 2011 21:46

    Saludos me podrias ayudar o a aclarar dudas, si es por este medio o si te pudieras poner en contacto conmigo,,, soy estudiante de maestria, y estoy desarrollando una aplicacion web semantica. en la cual por medio de protege realice la ontologia, en ella tengo definidas las clases, las relaciones y los atributos.. y por medio de jena necesito crear los individuos, me podrias decir como hacerle,,,, es decir, crear un individuo de una clase ya definida en la ontologia, y crearle los datos que tambien ya estan definidos. saludos y de antemano gracias por tu ayuda

    • rekkeb permalink*
      23 octubre 2011 19:18

      Hola Victor:
      -Lo primero es obtener la clase de tu ontología: Para ello tienes el método getOntClass() que te devolverá el objeto de Jena que representará a la clase de tu ontología. Siguiente la nomenclatura del ejemplo, si quisieras obtener la clase «Vertebrados», bastaría con que hicieras: OntClass miClase = model.getOntClass(NS+»:»+»Vertebrados);

      -Lo siguiente sería crear una nueva instancia dentro de esa clase, para ello: Individual indNuevo = miClase.createIndividual(NS+»:»+»NuevoIndividuo»); //NuevoIndividuo será el
      nombre que te interese darle a la instancia.

      -El siguiente paso es simplemente darle valores a las propiedades de esa instancia. Por ejemplo para dar valor a la propiedad «Peso», haríamos lo siguiente:
      indNuevo.setPropertyValue(model.getDatatypeProperty(NS+»:»+»Peso»),model.createTypedLiteral(21));

      Como ves, sacamos la propiedad de la ontología con model.getDatatypeProperty() y luego le asignamos un valor.

      Si en lugar de recorrer una a una todas las propiedades, quieres recorrerlas todas en un bucle, puedes hacerlo haciendo uso de los Iterators mediante el método: indNuevo.listProperties(). Que te devolverá un iterador de Property y que recorrerá cada propiedad contenida en esa instancia.
      Si quieres recorrer todas las instancias de la ontología: model.listInstances() …

      Ánimo con ese proyecto!!

  13. Yanet permalink
    2 noviembre 2011 20:06

    Hola ,necesito ayuda sobre como usar el ModelMaker, me podrias ayudar.
    Gracias

  14. Yanet permalink
    5 enero 2012 19:39

    Hola:
    Primero Happy new year!!!!
    Necesito aprender a usar algun razonador en jena. Necesito inferir conocimiento a partir de algunas reglas que ya tiene la ontologia.Conozco como trabajar este tema en protege pero es que necesito hacerlo en eclipse usando jena. Me podrias ayudar??????
    Gracias.

    • rekkeb permalink*
      21 enero 2012 20:51

      Hola:
      Yo para gestionar reglas en una ontología e inferir conocimiento a partir de ellas, he utilizado el motor de inferencias Jess. Es un motor que te permite leer las reglas SWRL que tengas almacenadas en tu ontología y a partir de ellas generar nuevo conocimiento que a su vez puedes añadir nuevamente a tu ontología.
      Jess puedes usarlo a través de protege (como un plug-in) y así comprobar si te resulta útil.

      Ánimo 😉

  15. Amauris permalink
    26 enero 2012 19:02

    Hola, estoy realizando una investigación en mi maestría sobre cómo utilizar la ontología para el aprendizaje de una asignatura(Álgebra), de forma que oriente al estudiante en la forma de resolver algún problema. Ya he trabajado con la última versión(4.1.0) de protégé guiándome por el tutorial que desarrolla el ejemplo de las pizas. Pasé un poco de trabajo porque el tutorial está escrito para otra versión pero finalmente encontré como hacer cada paso. La idea es que el estudiante pueda plantearle al sistema una situación problémica donde diga ¿qué tiene como datos? y ¿qué quiere obtener partiendo de esos datos? Mi duda es:
    1. ¿Cómo emplear la ontología del álgebra en el sistema?
    2. ¿Cómo interactúa la ontología con el sistema?
    Muchas gracias por la colaboración.

    • rekkeb permalink*
      29 enero 2012 13:16

      Hola Amauris.
      Normalmente cuando se quiere hacer consultas a una ontología se utiliza el lenguaje SPARQL. Es un lenguaje de consulta con una sintaxis similar a SQL, pero con la diferencia de que en lugar de trabajar con bases de datos relacionales, trabaja con tripletas de RDF.
      Quizás lo que planteas sería tan sencillo como:
      1- Construir y organizar una ontología que recoja todo el conocimiento que te interese sobre el Álgebra
      2- Contruir un pequeño parser que sea capaz de traducir las preguntas (limitadas) de los usuario a lenguaje SPARQL
      3- Lanzar la consulta a la ontología.

  16. Yanet permalink
    1 febrero 2012 17:34

    Hola:
    Puedo usar Jess para trabajar en java, es que la aplicacion la debo hacer en java.
    Sldos.

  17. Yanet permalink
    1 febrero 2012 18:19

    Ya aclare la pregunta anterior , disculpa la respuesta estaba en tu bog y no me habia dado cuenta. Comentas en el blog como trabajar para conocer las reglas que se dispran pero yo por el momento solo quiero saber como obtener el conocimiento dadas unas reglas que yo ya defini en protege, me podrias ayudar con esto??

  18. Taniana permalink
    10 febrero 2012 16:46

    Hola

    Estoy trabajando en ontologias y uso la herramienta protege, pero ahora necesito programar la integracion de tres ontologias, estoy observando que se puede usar jena para realizar esto, mi pregunta es, estoy trabajando con logica descriptiva y uso el razonador pellet para realizar las clasificaciones necesarias que se forma con mis axiomas y restricciones. Me puedes ayudar de como hago o donde debo buscar informacion

    Muchas Gracias

  19. Andrea M. permalink
    14 febrero 2012 04:01

    Hola.

    Estoy trabajando con ontologías y me gustaría saber como listar las restricciones de una clase.

    Muchas gracias

  20. Andrea permalink
    23 abril 2012 15:51

    Hola, estoy llenando una ontología desde java a traves de una interfaz gráfica web, pero una vez se guardan los datos ingresados y miro la estructura del archivo.owl, me aparece muchas cosas las cuales si lo hago desde protege no me aparecen y por lo tanto el tamaño del archivo crece muy rapido y el almacenamiento es muy demorado. Tu me podrias ayudar con el tema, de antemano muchas gracias.

    • rekkeb permalink*
      26 abril 2012 08:56

      Hola Andrea:
      Te echo una mano encantado, puedes especificarme más tu problema e intentamos verlo entre los 2??

  21. wondersito permalink
    26 abril 2012 03:04

    como puedo reutilizar una ontologia, necesito copiar o importar en otra ontologia la informacion, todo esto mediante java. Es sencillo con protege, pero utilizando código eh tenido problemas, no se si podrias ayudarme con esto porfa

  22. capote permalink
    18 junio 2012 23:18

    Hola:
    Espero me puedas ayudar, estoy haciendo un proyecto que utiliza Jena, pero tengo el siguiente problema: cuando intento cargar una ontología que tiene una propiedad de datos double y esta fue almacenada con un punto, Jena me lanza un error diciendome que el punto es reservado para la API,,,,,,,,, y bueno como lo soluciono, por favor si tienes una solucion te agadeceria que me orientaras. Atentamente.

    • rekkeb permalink*
      20 junio 2012 23:01

      Hola:

      Yo he utilizado Datatype Properties cuyo rango era Float y no he tenido problemas para leer su valor posteriormente.
      Te indico como lo suelo hacer yo a ver si te sirve:
      1- Supongamos que ya hemos cargado el individuo que nos interesa dentro del objeto: Individual ind;
      2- Cargamos la propiedad que nos interesa de nuestra ontologia: OntProperty prop = model.getOntProperty(NS+":"+"propValor");
      3- Obtenemos el valor de la propiedad para nuestro individuo: float valor = ind.getPropertyValue(prop).asLiteral().getFloat();
      4- O: double valor = ind.getPropertyValue(pit).asLiteral().getDouble();

      Si estas seguro que tu propiedad es de uno de esos tipos primitivos, no hay problema, aunque siempre es recomendable, realizar comprobaciones para hacer más robusto el código 😉

      Ya nos contarás si te ha servido.

  23. sonia permalink
    20 junio 2012 21:14

    Hola:
    Por fa necesito ayuda. Estoy haciendo un proyecto que emplea Jena para manipular las ontologias. Defini un datatypeProperty cuyo dominio es una clase Point2D y su rango es un double. Cree instancias cuyo valor tenia un punto(1.34) y las almacene en un fichero owl. Tengo un problema cuando decido cargarla. El error que me da es el siguiente: Exception in thread «AWT-EventQueue-0» com.hp.hpl.jena.rdf.model.ResourceRequiredException: «Cls(@_:A0, FrameID(9:11617 1))»
    at com.hp.hpl.jena.rdf.model.impl.StatementBase.mustBeResource(StatementBase.java:137)
    at com.hp.hpl.jena.rdf.model.impl.StatementImpl.getResource(StatementImpl.java:83)
    .
    Si fueras tan amable de responderme te lo agradeceria. Saludos

    • rekkeb permalink*
      20 junio 2012 23:01

      Creo que ya he respondido a tu comentario anterior 🙂

  24. Claudio permalink
    25 junio 2012 07:06

    Hola rekkeb. De verdad con tu tutorial me iluminaste, pero tengo un problema, si ya tengo una ontología (que creé anteriormente con la interfaz gráfica de Protégé) guardada en un fichero .OWL. Y ahora quiero agregar una nueva instancia (película) en la clase ANIMATION y luego establecer su id. (Tanto la clase ANIMATION como la propiedad hasID las creé en Protege anteriormente) con el siguiente código:

    String fileOWL = «file:///home/ONTOLOGIES/OntologyMovies.owl»,
    NS = «ontologyMovies»;

    OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
    model.read(fileOWL,»RDF/XML»);
    model.setNsPrefix(NS, «file:///home/ONTOLOGIES/OntologyMovies.owl»);

    OntClass genero = model.getOntClass(NS+»: «+»ANIMATION»);
    DatatypeProperty id = model.getDatatypeProperty(NS+»:»+»hasID»);
    Individual newMovie = model.createIndividual(NS+»: «+»Toy Story», genero);
    newMovie.setPropertyValue(id, model.createTypedLiteral(«tt1699720»));

    Pero me gener un NullPointerException en la última línea «newMovie.set…….», debido a que la instancia newMovie es nula, generado porque ya la clase «genero» es nulo.. Pareciese que no reconoce la clase ANIMATION del fichero .OWL…… y ya degenera en todos los consecuentes nulls….

    Sabrías el porque?… Te agradezco de antemano tu atención!!
    Un saludo!

    • rekkeb permalink*
      26 junio 2012 20:08

      Para acceder directamente a una Propiedad, una Instancia o una Clase en Jena, el framework espera que le pases la URI completa hasta el recurso.
      Con otros frameworks como ProtegeOWL puedes componer la URI con el Prefix que le tengas asignado a cada una de ellas, pero con Jena yo me he encontrado que suele dar problemas y es preferible utilizar toda la URL del recurso que busques y componer su URI.

      Para ello debes obtener la URL que corresponde al Namespace principal de tu ontología. Si no lo has cambiado, por defecto el Namespace principal se asocia con el prefijo vacío («»). Para capturar su URL puedes utilizar el método:
      String url = model.getNsPrefixURI("");

      Verás que la url termina con # por tanto sólo falta que añadas el recurso que buscas para completar la URI.
      Por ejemplo:
      OntClass genero = model.getOntClass(url+"ANIMATION");

      A ver si asi te sirve 😉

  25. Claudio permalink
    25 junio 2012 07:34

    Otra pregunta. Después de hacer los cambios que haga en la Ontología con mi aplicación Java, hay que agregar algún comando de refresh? para que queden todos registrados en el fichero .OWL en disco?… del estilo del flush() de los BufferedWriter? Porque todos esos cambios son en memoria, como los registro en disco?

    • rekkeb permalink*
      26 junio 2012 20:15

      Efectivamente. Todos los cambios que realices en la ontología quedan almacenados en memoria, por tanto tienes que persistirlos a un fichero en disco o a una base de datos (que Jena también lo permite).
      Hay un par de métodos que son model.write y model.writeAll que hacen exactamente eso que buscas. Ambos están sobre cargados y aceptan multitud de parámetros.
      Es preferible utilizar los que aceptan un OutputStream ya que te evitas problemas de codificación con los caracteres.
      La diferencia entre ambos métodos es que writeAll escribe todo el modelo nuevamente a disco y write escribe sólo las nuevas aserciones. Suele ser recomendable utilizar este último, pero prueba y el que más se adapte a lo que busques… pues ya sabes 😉

      • Claudio permalink
        28 junio 2012 01:30

        Muchísimas gracias por tu eficiencia y rapidez en la respuesta. Efectivamente en relación a los prefijos en Jena, ya había encontrado la forma, el problema es que cuando veo el fichero .OWL, para cada definición se registra TODA la URI entera, y bueno se ve un poco engorroso ver sendas líneas de paths en todo el fichero. No encuentro la forma de evitarlo… si aplico el código que muestras tu sobre el model.setNsPrefix(…) me saltan excepciones.. Entonces opté por dejarlo así, al fin y al cabo lo que importa es que la Ontología esté bien estructurada.

        Lo que si me fijo es que, yo estoy trabajando sobre una Ontología que creé en Protegé la cual tengo en un fichero «ontologia.owl». Luego las instancias las agrega en otro fichero «ontologyFill.owl», asignando como ontología base la nombrada anteriormente, y resulta que pareciera que en «ontologyFill.owl» se vuelven a definir todas las clases y propiedades.. porque? si se supone que al asignar una ontología base ya tiene todas esas definiciones a través de las referencias con la URI respectiva?…

        Espero no incordiar, pero la verdad que tu tutorial y respuestas que he visto, me han ayudado mucho!!

        Un saludo!

      • rekkeb permalink*
        30 junio 2012 18:45

        Hola, realmente en tu ontología ontologyFill.owl no vuelven a definirse las clases y propiedades de ontologia.owl. Lo que ocurre es que Protege, al importar una ontología, te muestra las clases que contiene, sus propiedades, sus restricciones … , para que te sea más sencillo trabajar con ellas. Si te fijas aparecen un poco difuminadas y no te deja modificar nada de ellas.
        Si abres el fichero ontologyFill.owl con un editor de texto, verás que realmente no hay ni rastro de las clases de ontologia.owl. Sólo deberías tener la definición del Namespace junto con el prefijo que le hayas puesto y un apartado owl:imports que hará referencia a la ruta del fichero ontologia.owl.
        Con esa información, protege te muestra todas las clases de tus ontologías importadas para mayor comodidad a la hora de trabajar con ellas.

  26. Claudio permalink
    3 julio 2012 22:53

    rekkeb!
    Tengo una pregunta.
    Yo tengo creada en la Ontología una DatatypeProperty llamada «hasID» que tiene como dominio la clase «Content» que a su vez tiene una serie de subclases; y como rango un literal «String»…
    Entonces, quiero conocer todas las instancias diferentes de «Content» y sus ID’s, para buscar una ID que estoy pasando como parámetro a la aplicación. Lo ideal y más rápido sería poder obtener todos los ID’s diferentes sin importar sus contents..
    Hay alguna manera de hacerlo?!…
    Un saludo!

    • rekkeb permalink*
      4 julio 2012 19:16

      Si tienes tu clase en un objeto OntClass, verás que hay un método que se llama listInstances() que recibe un parametro booleano. Este parámetro indica si quieres que te liste también las instancias de las subclases que a su vez serían instancias (logicamente) de la superclase. De esta forma puedes recorrer todas las instancias e ir comparando hasta encontrar la que busques.
      Otra opción es utilizar el lenguaje de consulta SPARQL si necesitas búsquedas más detalladas y que requieran una complejidad menor, ya que ten en cuenta que la complejidad del método anterior es O(n).

      Saludos!

  27. alexander bautista permalink
    19 julio 2012 07:01

    Hola en verdad necesito ayuda…….tengo un aontologia echa en protege y la he conectado en netbeans ,he hecho consultas mediante java main class.y mi siguiente paso es hacer las consultas, modificar la ontologia en un jsp….pero no encuentro como hacerlo no se si me pudieras ayudar el codigo que utiliso es…

    OntModel model = null;
    String ns = «http://www.owl-ontologies.com/Ontology1339017836.owl»;
    model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM_RULE_INF );
    java.io.InputStream in = FileManager.get().open( «Ontologia_Muebles1.owl» );
    //java.io.InputStream in = FileManager.get().open( «Parcial.owl» );
    if (in == null) {
    throw new IllegalArgumentException(«Archivo no encontrado»);
    }
    model.read(in, «»);
    String queryString = «PREFIX po: «+
    «select ?Producto ?tamaño «+
    «where»+
    «{ «+
    «?Producto po:TieneTamaño ?tamaño «+
    «}»;

    Query query=QueryFactory.create(queryString);
    QueryExecution qe=QueryExecutionFactory.create(query, model);
    try{
    ResultSet results=qe.execSelect();
    ResultSetFormatter.out(System.out,results,query);
    }finally{qe.close();}

  28. Claudio permalink
    21 agosto 2012 12:15

    rekkeb!
    Volviendo al tema de mi ontología, resulta que la ontología base la tengo en un directorio local al igual que la ontología poblada… Pero el problema es que ahora si quiero ejecutar la aplicación en otro directorio y CONTINUAR poblando la ontología, me dan nullpointerexception, como si no reconociera las ontologías, y en el código ya cambié las rutas indicando a los paths el nuevo directorio de la aplicación? es un problema de Namespaces? me podrías ayudar?!..

    Una vez mas y como siempre, te lo agradezco de antemano!!
    Claudio!

  29. 28 noviembre 2012 21:43

    hola, estoy trabajando con jena en java, resulta que obtengo las propiedades de la ontoligia, pero me gustaria saber como consultar los valores que tiene cada propiedad.
    los valores a los que me refieron son a los qeu en protege me salen como :
    PropiedadX some integer[>»54500″^^integer,<"54500"^^integer].

    gracias.

  30. Yanet permalink
    14 diciembre 2012 02:03

    Hola
    Necesito escibir una regla para razonar sobre una ontologia con ella , me es irrelevante escribirla para algun razonador de Jena o alguno externo que soporte reglas SWRL, lo que me sucede es que mi regla se basa en el uso de cuantificadoresy estoy buscando una forma de representar el cuantificador universal , en caso de que se pueda. Me podria usted ayudar?
    Graias y Disculpe la molestia. 🙂

  31. Mancho permalink
    7 febrero 2013 00:38

    hola. muy buen aporte.
    Espero me puedas ayudar en esto:
    Como puedo hacer para que una propiedad sea del tipo de una clase si es que se puede.
    Considerando el mismo ejemplo
    Supongamos que tenemos una clase color y que tiene sus propias propiedades y ahora quiero que los animales también la tengan… no como una DatatypeProperty si no como un objeto.
    Saludos

  32. 4 marzo 2013 09:24

    Hola, que tal una pregunta. Cree una ontología en protege, y agrego mis instancias con jena. Utilizo twinkle-2.0-bin para realizar las consultas en la ontología y despues utilizarlas en mi proyecto. pero ninguna consulta de sparql de esta pagina http://www.w3.org/TR/rdf-sparql-query/ me funciona, porque. Solo funciona una consulta que obtiene los individuos que agrege al concepto.

  33. Aide permalink
    30 septiembre 2013 15:00

    Hola 🙂 Me he dado cuenta de la cantidad de tutoría que aportas solo por amor a la ciencia (como se suele decir) y la verdad te admiro por eso.
    Yo soy una mas de las principiantes con Ontologías y me encantaría muchísimo que me pudieras ayudar a resolverla. Al igual que muchos he creado ontología con Protege y las he manipulado con Jena. Mi pregunta esta relacionada en el ámbito de «evaluación», es decir, como se podría saber si una ontología esta construida lo mejor posible, se dice mucho que esto se hace con la colaboración de expertos, pero es que tu conoces alguna herramienta que pudiera evaluar una ontología construida ??
    como para encontrar los errores de inconsistencia, errores de partición, errores de semántica o redundancia, errores de omisión de conocimiento, etc.
    Tambien tengo la duda sobre la diferencia entre Jena y Jena2
    Espero que me pudieras ayudar o mostrarme donde esta el camino. Te deseo un excelente día 😀

  34. Diego permalink
    29 noviembre 2013 15:09

    Hola!!!!!!!!!! hare correr loq hiciste felicidades por este tutorial. Una pregunta como poblaria una ontologia trayendo la informacion desde dbpedia?
    osea debo crear mi ontologia en protege y despues poblarla desde internet usando dbpedia.org a traves de mi programa hecha en java usando la libreria jena gracias de antemano

  35. Espinosa permalink
    16 May 2015 17:29

    Como agrego datos a una ontologia que yo estoy construyendo desde 0 en jena?

  36. Espinosa permalink
    16 May 2015 17:32

    Hola a todos!!…espero que me puedan ayudar…necesito saber como puedo agregar datos a una ontologia que yo estoy construyendo desde 0 en jena?…me explico mejor, yo extraigo la informacion desde una base de dato espacial, y debo escribir esa informacion en la ontologia, como lo hago??

  37. Eric Jonathan permalink
    14 enero 2016 19:08

    Hola am yo tengo una duda no e podido implementar mi ontologia bien en netbeans, pero necesito hacer que funcione con un razonador no se si alguien tenga un proyecto, que me pueda proporcionar para guiarme de antemano gracias y excelente articulo.

  38. ana lezama permalink
    11 diciembre 2017 21:05

    en un articulo hablaba de extraer propiedades difusas pero llevo meses investigando como extraerlas con owl api o jena y no encuentro nada, agradeceria me dieran una ayudadita, porque ya extraje las propiedades de datos y las de objeto pero con esas ya me desespere, y no entiendo, gracias.

Deja un comentario