Algunos experimentos básicos con Protégé y Jena

Por fin estoy de vuelta. Hace casi mes y medio que no escribo nada en el blog, pero han sido por causas mayores, no es que me haya olvidado de él, así que no ha pasado a formar parte de esos millones de blogs abandonados que hay por Internet. Voy a aprovechar esta vuelta a la rutina semanal de escritura para recopilar una serie de cosas que he ido utilizando en los últimos meses, en la elaboración de algunos experimentos dentro de mi proyecto de doctorado relacionado con la Web Semántica. Posiblemente a mucha gente le suene a chino, aunque la verdad es que hay gente que usa esta serie de cosas. Si no estás al corriente de esta serie de cosas y tienes algo de curiosidad, puedes echar un vistazo a la introducción a la web semántica que escribí hace unos meses, o a este otro post algo más teórico sobre técnicas y lenguajes para la representación del conocimiento.

Entrando ya en materia, en este post resumo una serie de cosas que he utilizado para la creación y el manejo de Ontologías, mediante la utilización del entorno de desarrollo de ontologías Protégé y el marco de desarrollo para la Web Semántica Jena.

Exportar una ontología a almacenamiento persistente

Actualización: En las versiones recientes de Protégé esto ya no es necesario, ya que Protégé permite trabajar almacenando los datos en Jena directamente.

En los experimentos que he realizado he utilizado Protégé para la creación de la ontología así como para las pruebas y la depuración, almacenando la información normalmente en un archivo de texto con la representación en OWL. Sin embargo para algunos de los experimentos he querido utilizar un almacenamiento persistente basado en base de datos, para lo cual es necesario exportar la información OWL del archivo de texto a un modelo relacional.

Para ello la mejor forma que he encontrado, teniendo en cuenta que el objetivo posterior era acceder a la información desde el propio Protégé o mediante Jena, es utilizar el plugin de Protégé Protege2Jena. Su instalación y funcionamiento es muy sencillo.

  1. Descargar el archivo de la página y descomprimirlo dentro de la carpeta plugins de Protégé.
  2. Ejecutar Protégé y abrir el proyecto OWL que queremos exportar a almacenamiento persistente
  3. Seleccionar File >> Export to Format >> Jena Persistent Model
  4. Cumplimentar la información que se nos solicita en el formulario. En este caso se selecciona utilizar un almacenamiento en una base de datos MySQL se nombre PruebasOntology.
    Diálogo de configuración de exportación del modelo a almacenamiento persistente para Jena class=
  5. Pulsar OK

Con esto ya habremos exportado el modelo a almacenamiento persistente y estará listo para ser utilizado desde Jena o desde el propio Protégé. Para conectarnos al modelo desde Protégé el funcionamiento es diferente al habitual mediante archivos OWL.

  1. Seleccionar File >> Create new Project
  2. Seleccionar OWL / RDF Database y pulsar next
  3. Seleccionar Jena Persistente Model y pulsar finish
  4. Se nos muestra un diálogo como el de importación. Debemos cumplimentarlo con los datos de conexión a la base de datos y al modelo exportado y pulsar Ok.

Cargar una ontología con Jena

En este caso consideramos que tenemos una ontología almacenada en un archivo OWL. Con el siguiente código se puede cargar el modelo y empezar a trabajar con él mediante la api de Jena.

OntModel model = null;
 
// crear un modelo utilizando como razonador OWL_MEM_RULE_INF
model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_RULE_INF );
 
// abrir el archivo con la ontología
java.io.InputStream in = FileManager.get().open( "PruebaOntology.owl" );
if (in == null) {
    throw new IllegalArgumentException("Archivo no encontrado");
}
 
// leer el archivo RDF/XML
model.read(in, "");
 
//
// El siguiente código muestra un listado con las clases e instancias existentes en el modelo
//
System.out.println( "Clases/Instancias");
System.out.println( "=================");
ExtendedIterator iteratorClasses = model.listClasses(); 
while ( iteratorClasses.hasNext() ){
    OntClass ontClass = (OntClass) iteratorClasses.next();
    System.out.println( ontClass );
 
    ExtendedIterator iteratorInstances = ontClass.listInstances();
    while ( iteratorInstances.hasNext() ){
   System.out.println( "\t"+iteratorInstances.next() );
    }
    System.out.println("");
}

Cargar una ontología con Jena desde almacenamiento persistente

Tras el anterior ejemplo, veamos como conectarnos a una ontología almacenada en el almacenamiento persistente del comienzo. Para ello

String strModel = "jdbc:mysql://myserver/PruebaOntology";
String strModelUser = "protege";
String strModelPwd = "";
 
ModelRDB model = null;   
OntModel modelOnt = null;
String ns = "http://www.example.com/PruebasOntology.owl";
 
// Creo la conexión con el modelo persistente       
IDBConnection conModel = new DBConnection(strModel, strModelUser, strModelPwd, "MySQL");
 
// abro el modelo desde el almacenamiento
ModelMaker maker = ModelFactory.createModelRDBMaker(conModel);
model = (ModelRDB)maker.openModel("PruebaOntology");
 
// creo el modelo utilizando como razonador OWL_MEM_RULE_INF, sobre el modelo abierto
modelOnt = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_RULE_INF, model);
 
//
// Como ejemplo de utilización obtengo todas los canciones del autor "Elvis Presley"
//
 
// obtengo la instacia del autor "Elvis Presley"
Individual autor = model.getIndividual( ns + "#Elvis_Presley" );
 
// obtengo la propiedad que relaciona las canciones con su autor
Property isAutorCancion = modelOnt.getProperty(ns+"#isAutorCancion");
 
// obtengo las canciones y las recorro
NodeIterator iteratorCanciones = autor.listPropertyValues(isAutorCancion);
while ( iteratorCanciones.hasNext() ) {
    OntResource cancion = (OntResource)iteratorCanciones.next();
    System.out.println(cancion);
}

Ejecutar una consulta SPARQL desde Jena

En los ejemplos anteriores hemos visto cómo cargar modelos con Jena y cómo utilizar de forma básica su api para acceder a la información representada. En esta ocasión vamos a ver cómo realizar consultas sparql sobre el modelo. Para ello cargamos el modelo y ejecutamos una consulta sparql con el mismo objetivo que en el ejemplo anterior, de obtener todas las canciones del autor “Elvis Presley”.

OntModel model = null;
String ns = "http://www.example.com/PruebasOntology.owl";
 
// crear un modelo utilizando como razonador OWL_MEM_RULE_INF
model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_RULE_INF );
 
// abrir el archivo con la ontología
java.io.InputStream in = FileManager.get().open( "PruebaOntology.owl" );
if (in == null) {
    throw new IllegalArgumentException("Archivo no encontrado");
}
 
// leer el archivo RDF/XML
model.read(in, "");
 
//
// El siguiente código ejecuta una consulta sparql que
// devuelve todas las canciones cuyo autor es Elvis Presley
//
 
String queryString = 
   "PREFIX po: <http://www.example.com/PruebasOntology.owl#> "+
   "SELECT ?cancion "+
   "WHERE  "+
   "{  "+
   "   po:Elvis_Presley po:isAutorCancion ?cancion . "+
   "}";
 
 
Query query = QueryFactory.create(queryString);
 
// Ejecutar la consulta y obtener los resultados
QueryExecution qe = QueryExecutionFactory.create(query, model);
 
try {
   ResultSet results = qe.execSelect();
   ResultSetFormatter.out(System.out, results, query) ;
} finally { qe.close() ; }
Twitter Digg Delicious Stumbleupon Technorati Facebook Email

79 Respuestas para “Algunos experimentos básicos con Protégé y Jena”

  1. Ya se echaban de menos tus post tío !

    Saludos 🙂

  2. Hola amigo es posible que me envies tu ontologia con la cual haces la explicacion de antemano te lo agradecieria mucho ya que si me urge saber como se hace esto

  3. Hola:

    Estoy trabajando con recuperacion de informacion semantica, y encontre los ejemplos que tienes usando JENA y protége, me gustaria saber si es posible que me puedas enviar la ontologia con la cual trabajas en estos ejemplos.

    Saludos: Gerardo

  4. Edgar, Gerardo, en http://swoogle.umbc.edu/ tenéis un buscador con el que podéis obtener multitud de ontologías de todo tipo sobre las que realizar pruebas.

  5. Hola…
    Estoy trabajando en un proyecto en el cual construyo una ontología en protégé-OWL y necesito conectarla a una base de datos siguiendo el modelo orientado a objetos, la bd está hecha en DB4O (Data Base for Objects)…

    Agradecería mucho cualquier ayuda que me puedan prestar que sirva de guia para continuar con mi proyecto..

    Saludos…

  6. Gracias amigo ya se de la existencia de swoogle y he hecho tengo mi propia ontologia que he desarrollado en Protege la peticion es relacionada con tu ejemplo ya que me gustaria probarlo con tu ontologia que usas para dichos ejemplos si me pudieras proporcionar la ontologia me seria de gran ayuda pero si no se puede de todos modos gracias =)

  7. Muy buen post! Te lo agradezco .

    Saludos y haber si puedes poner más información sobre la WebSemántica!!

    Muchas gracias.

  8. Hola,
    Mi duda es la siguiente:

    Estoy desarrollando un builtin para utilizarlo posteriormente en alguna regla en Protegé.
    Este builtin debe de insertar un valor concreto en una determinada relación que corresponde a una instancia determinada.

    Yo lo que hago es lo siguiente:

    1º Me conecto a Base de datos MySQL
    2º Cargo el fichero OWL en un modelo
    3º efectuo la inserción utilizando para ello el modelo, es decir,con la
    instrucción model.add(xxxxxx), es decir, utilizando el API de Jena

    He comprobado y la nueva inserción se realiza correctamente en el modelo.

    Es correcto esto? o debo de ejecutar un sentencia SPARQL como una “INSERT”
    ?

  9. Hola Urtza, en efecto, puedes incorporar nueva información al modelo utilizando directamente la api de jena.

  10. Muchas gracias,
    Me has resuelto una gran duda que tenía y muchos problemas 😉
    Un salu2

  11. Ante ayer dejé un comentario, pero se ve que no quedo. Cuando lo envié me dijo duplicado. De todos modos ya resolví lo que te consultaba. Quería configurar un Joseki para que tuviera inferencia con OWL dadas las restricciones para la clasficacion, y además reglas externas definidas. Hice un post al respecto en mi blog.
    http://nacho.larrateguy.com.ar/2007/11/27/configurar-joseki-para-inferencia-en-un-modelo-owl-reglas/

    Has trabajado con Jena y SWRL? Sabés si lo soporta? O se debería utilizar algún razonador entre medio que lo soporte?
    Aún no busqué mucho acerca del tema, pero está interesante.
    Saludos

  12. Ola, me gustaría saber si alguien de ustedes sabe algun sitio donde encontrar algun manual o libro acerca del Protégé (a poder ser en castellano)

  13. Que tal un gusto, mi pregunta es: que quiere decir con “almacenamiento persistente”, y ademàs para que utilizo Protege y Jena, porque segùn tengo entendido con los 2 programas se hacen ontologias, osea para que los 2.
    Muchas Gracias

  14. Jena es una API de JAVA con la que puedes programar. Hacer SPARQL,
    hacer almacenamiento persistente, cargar en memória ontologías, editarlas via código JAVA,etc.

    Protege viene a ser más un editor/creador de ontologías, luego tiene sus disstintos plugins para visualizar owl’s, hacer almacenamiento persistente tal como lo hace JENA,etc.

  15. Guillermo Becerra Córdova 08. Feb, 2008 en 7:43 pm

    Hola:
    Estoy buscando ejemplos de ingeniería del conocimiento. Te escribo para saber si me puedes orientar.
    Por tu atención, gracias.
    Atte.
    Guillermo

  16. Hola.
    Soy nueva en esto de las consultas a las ontologóas por medio del SPARQL en JENA. He visto ya el ejemplo y lo he tratado de implementar en una consulta sencilla a mi ontología y aunque no me muestra ningún error, no me muestra resultados, es decir como si la consulta no encontrara nada…..
    La consulta que quiero hacer es la siguiente:
    Si tengo una Clase llamada Fire y quiero consultar todas sus subclases ¿Cómo iría la sintaxis de la consulta?…Espero me puedan ayudar…..Llevo ya dos días con lo mismo y no logro hacerlo funcionar…Muchas gracias

  17. Hola Clarissa,

    Con la siguiente consulta puedes obtener todas las tripletas “clase subclasede clase”, utilizando rdfs:subClassOf

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#&gt;
    SELECT ?sc ?c
    WHERE
    {
    ?sc rdfs:subClassOf ?c
    }

    Si quieres obtener las subclases de una clase en concreto tendrías que sustituir ?c por la clase que desees.

  18. hola amigo
    Sabes estoy desarollando una ontologia en la cual tengo que realizar varias consultas a diferentes bases de datos, pero protege solo permite realizar consultas solo a una base de datos por el url de protege, pero estaba pensando en esta solucion, la cual consiste en crear un repositorio en el cual apunte el url de la ontologia, en este repositorio estaran las diferentes direcciones de las diferentes bases de datos en las cuales se van a realizar las consultas, la pregunta es se puede realizar lo que propongo, y como lo hago,
    gracias por tu ayuda

  19. Hola fausto, protégé se conecta a la bbdd que se le indiqué y utiliza unas tablas con una disposición especial para almacenar las tripletas rdf. En el caso de que quisieras unir la información de varias bbdd quizás podrías sustituir estas tablas por vistas que se definan sobre el conjunto de bases de datos que necesitas, pero me parece que seguramente tendrás bastantes problemas. De todas formas no recuerdo la estructura de estas tablas, por lo que te recomendaría que lo probases, no pierdes nada.

  20. Hola!!! no has probado abrir ontologias en RDF con Protege, yo he tenido algunos problemas con eso y pense q podrias ayudarme.

    Gracias de antemano

  21. Ola a todos!
    Tengo una preguntita, si yo quiero crear una clase Pais en Protege, seria Colombia un individuo o una subclase? o esto depende de cuanto quiera interiorizar en el concepto?

  22. En efecto Andrea, podría crearla tanto como instancia o como clase. Dependerá de lo que estés modelando y de cómo quieras usarlo.

  23. hola amigo tengo una duda protege apunta solo a una url ejemplo http://www.owl-ontologies.com/Ontology1208811204.owl; pero aqui nace la duda cuando quiero acceder a varias bases de datos como lo hago, ya que segun la dir anterior solo puedo acceder a una base da datos, gracias

  24. estoy haciendo una ontologia y me hace falta contar la cantidad de elementos de una clase y listarlos alguien , sabe como hacer eso.

  25. Hola!!
    Necesito instalar Jena 2.0 con Protégé, pero no he podido, me podrías explicar como hacerle?
    Gracias!!!!

  26. Hola buenas, necesito razonar una ontologia owl en java.
    -La ontologia owl la cree desde protege en un archivo.owl, esta tiene datos y reglas swrl.
    -Quiero usar jena para poder mostrar las instancias que cumplan alguna regla swrl en particular.

    ¿Jena o jena 2 pueden razonar reglas swrl? ¿Hay alguna forma de conseguirlo?
    Si alguien tiene idea porfavor necesito ayuda urgente. Mil gracias de antemano!

  27. HOLA, su publicacion me ha servido de mucha ayuda, estoy crendo una ontologia pero no me he podido conectar a la base de datos ya que cuando intento exportar el archivo.owl me aparece el siguiente error:java.lang.ClassNotFoundException: com.mysql.jdbc.Drive. Yo descarge este driver: http://dev.mysql.com/downloads/connector/j/5.1.html, pero aun asi no he podido conectarme, agradeceria mucho la ayuda que me pueda brindar. Gracias.

  28. hola estoy trabajando con protege-owl version 4.0 y necesito el plugin SWRL para poder trabajar con el en esta version de software , quein lo tenga pude hacerme el favor de decirme donde lo puedo encontrar para descargarlo

  29. Hola buenas, necesito razonar una ontologia owl en java.
    -La ontologia owl la cree desde protege en un archivo.owl, esta tiene datos y reglas swrl.
    -Quiero usar jena para poder mostrar las instancias que cumplan alguna regla swrl en particular.

    ¿Jena o jena 2 pueden razonar reglas swrl? ¿Hay alguna forma de conseguirlo?
    Si alguien tiene idea porfavor necesito ayuda urgente. Mil gracias de antemano!

  30. Alejandro Luisi 03. Jul, 2009 en 5:21 am

    Hola Estimados !,
    en Agosto próximo comienzo mi proyecto de carrera sobre este tema, voy a usar Protégé 4, Java, Pellet y/o Jena. El proyecto consta de hacer un validador de soluciones de Help Desk, es decir parto de una lista de soluciones y las tengo que validar con una ontología de un conocimiento (ej. reparación de pc).
    Mi duda es la siguiente, como me viene la solución ya escrita, ¿cómo hago para llevar esa solución a Protégé y validarla con los axiomas de la antologia?, ¿cómo creo una instancia para validación y luego responder?.

    saludos a todos,
    Alejandro.

  31. Estoy empezando con el tema de las ontologias y razonadores, sabras tú de algun ejemplo en el cual pueda yo cargar una ontologia y aplicar una simple regla SWRL y obtener el resultado de esta regla, todo esto usando java. ya que estyo bloqueado con este tema y me urge.
    Saludos y gracias
    Antonio

  32. Hola a todos…

    Estoy tratando de correr un query de sparql con jena en netbeans. ya importe todas las clases que necesita. Es necesario que el archivo que lea sea un rdf? o puede ser tambien un owl?

    Gracias 🙂

  33. Jimmy Nevar Tulcan 27. Oct, 2009 en 11:51 pm

    hola…
    soy un estudiante de Ing se sistemas y necesito un ejemplo de ontologia en protege 3.4 ademas es muy interesante todo lo de la web semantica…
    gracias

    jimmy

  34. Hola!
    Tengo una pregunta: Ya tengo mi modelo creado y quiero obtener informacion de la tabla jena_g1t1_stmt. Como lo hago? Estoy utilizando por supuesto SPARQL pero no soy capaz.
    Teneis algun ejemplo, de una vez ya creado el modelo, sacar informacion de jena_g1t1_stmt

    Muchas gracias

  35. Hola Marta, ten en cuenta que Jena lo que hace es almacenar la información de tu modelo (clases e instancias) en tablas de la base de datos, pero cuando haces consultas, no las haces directamente sobre esas tablas con SQL, sino que se utiliza SPARQL para realizar consultas sobre el modelo, utilizando los nombres de clases e instancias que hayas definido.

    Internamente Jena se encarga de traducir tu consulta SPARQL en el SQL necesario para acceder a las tablas de la base de datos.

  36. Hola!
    Estoy intentando trabajar con ontologías, y creo que tengo un poco de lío. Ya he hecho diversos ejemplos con Jena para cargar una ontología de la BD, almacenar una ontología (desde un archivo a una BD), y consultar con SPARQL una ontología utilizando una URI.
    Mi problema es que he comprobado que, aunque almacene la ontología en la BD, luego, al hacer la consulta con SPARQL, como le pasas la URI (ver a continuación) lo hace sobre el fichero inicial, y por lo tanto no se entera de los cambios que ha habido (y que se supone que están en la BD). ¿cuál es entonces el modo en el que hay que trabajar? Cargas la ontología desde la BD (se supone que ya la tienes almacenada de antes) y la tienes en memoria, pero..¿entonces qué uri utilizas al hacer las consultas SPARQL?
    Otro ejemplo, sin trabajar con una BD: cargo la ontología y realizo modificaciones sobre ella. Luego realizo una consulta para ver si las modificaciones se han realizado correctamente, y compruebo que no es así (porque a la consulta le paso el URI, por lo que deduzco que la realiza sobre el archivo de ontología orginal)(por ejemplo, haría: Individual ind = model.getIndividual( “http://www.w3.org/2001/sw/WebOnt/guide-src/food” + “#Peache” );). Sin embargo, si recorro la ontología que tengo en memoria, las modificaciones sí que están presentes.

  37. Hola Susana,

    Las consultas que se realizan con SPARQL se realizan sobre un modelo, la URI que utilizas en las consultas sirve para identificar los elementos de la ontología, pero no para decir si se realiza sobre una u otra fuente de datos.

    Este modelo puede cargarse desde un archivo OWL o desde base de datos. Tiene pinta de que lo que te pasa es que estás realizando consultas sobre un modelo creado a partir de un OWL y que utilizas la API de Jena para recorrer un modelo desde BD.

    Revisa aténtamente los ejemplos que he puesto en el post, seguramente te sirvan para aclararte.

  38. Hola otra vez y muchas gracias,
    ahora tengo otra pregunta 😉

    Se puede hacer, seria posible una consulta en sparql que de:

    cantante | numero de canciones

    y si es asi, como se puede plantear en sparql.

    Muchisimas gracias.

  39. Hola Marta,

    La especificación de SPARQL (http://www.w3.org/TR/rdf-sparql-query/) no incluye sintaxis equivalente al “group by” de SQL, que es lo que necesitarías. Sin embargo Jena dispone de un conjunto de extensiones de SPARQL entre las que se encuentra esta característica. Puedes consultarlo en: http://jena.hpl.hp.com/wiki/SPARQL_Extensions#GROUP_BY

    Espero que te sirva.

  40. OK, lo mirare, muchisimas gracias!

  41. Hola, tengo una duda. Me gustaría conocer si existe alguna librería o algún tipo de herramienta ya creada que me permita dibujar de una forma sencilla varios objetos RDF.
    Un saludo y gracias

  42. Hola Estibaliz, puedes utilizar por ejemplo Protégé, dispone de plugins que permiten crear gráficos utilizando varias librerias existentes en Java. Puedes probar a utilizar también también graphviz (http://www.eslomas.com/index.php/archives/2009/02/03/generacion-automatica-de-graficos-con-graphviz/).

  43. Hola que tal, mi duda esla siguiente:
    Estoy trabajando en un proyecto relacionado con un buscador semántico. el caso es que cuando creo un proyecto (NetBeans) en donde cargo mi ontología y hago consultas y me las despliega, todo resulta correcto. Ahora, cuando éste lo agrego a un proyecto donde estoy manejando Struts, me marca un error al cargar el doc owl.

    java.lang.IllegalArgumentException: El archivo: tesis.owl no fue encontrado
    com.myapp.struts.SPARQLProjects.BDSparql.BDSparqlConsul(BDSparql.java:20)
    com.myapp.struts.ActionProjects.searchEngineAction.execute(searchEngineAction.java:41)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

    si alguien me puede ayudar, se lo agradeceré

  44. Hola
    Estoy haciendo un trabajo en el que tengo que hacer consultas sparql a la dbpedia en java usando eclipse. Sin embargo soy incapaz de conectarme al a base de datos de la dbpedia. Alguna idea o ayuda de como poder hacerlo.
    Gracias de antemano

  45. Hola
    Actualmente me encuentro trabajando en un proyecto de smeántica y voy a utilizar jena, por lo cual tu articulo me parece de mucha utilidad pero tengo una pregunta

    Serias tan amable de proporcionarme tu archivo PruebaOntology.owl para poder ejecutar tu ejemplo correctamente.
    Saludos y gracias

  46. hola que tal , tengo una duda muy basica sobre web semantica …. las instancias de la ontologia , es decir las clases y subclases (los datos) son almacenadas en un .owl o en una base de datos corriente?

  47. no me refiero a la ontologia(que si va en un .owl ) si no a una instancia

  48. Ricardo, tanto el modelo de la ontología (clases y propiedades) como las instancias de las clases, pueden almacenarse en archivos OWL, o en bases de datos.

  49. gracias patxi por tu respuesta.
    y cual de las dos opciones es la mas recomendable para alguien que esta empezando en esto?

  50. y el repositorio de estos documentos owl vendria siendo jena?