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

Patxi Echarte, May 31st, 2007

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

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() ; }
   
Comparte esta información

30 Comentarios para “Algunos experimentos básicos con Protégé y Jena”

  1. Sirw2p dice:

    Ya se echaban de menos tus post tío !

    Saludos :)

  2. Edgar dice:

    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. Gerardo dice:

    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. Patxi dice:

    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. Ambar dice:

    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. Edgar dice:

    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. alex dice:

    Muy buen post! Te lo agradezco .

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

    Muchas gracias.

  8. Urtza dice:

    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. Patxi dice:

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

  10. Urtza dice:

    Muchas gracias,
    Me has resuelto una gran duda que tenía y muchos problemas ;-)
    Un salu2

  11. Nacho dice:

    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. Martinez dice:

    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. Alex dice:

    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. Memfis dice:

    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 dice:

    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. Clarissa dice:

    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. Patxi dice:

    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#>
    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. fausto dice:

    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. Patxi dice:

    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. dmfaith dice:

    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. andreanami dice:

    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. Patxi dice:

    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. fausto dice:

    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. Yanier dice:

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

  25. Yiya dice:

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

  26. Lau dice:

    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. Karen P dice:

    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. Yanier dice:

    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. Yanier Diaz dice:

    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 dice:

    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.

Deja un comentario