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.
- Descargar el archivo de la página y descomprimirlo dentro de la carpeta plugins de Protégé.
- Ejecutar Protégé y abrir el proyecto OWL que queremos exportar a almacenamiento persistente
- Seleccionar
File >> Export to Format >> Jena Persistent Model
- 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.
- 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.
- Seleccionar
File >> Create new Project
- Seleccionar
OWL / RDF Database
y pulsarnext
- Seleccionar
Jena Persistente Model
y pulsarfinish
- 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() ; } |
por que yo solo conosco cuando jena mapea las tripletas en la base de datos y despues a partir de esto se pueden formar documentos owl con datos, esta es la metodologia correcta?
Ricardo, puedes utilizar Jena indistintamente con archivos OWL o con almacenes de tripletas RDF, tienes ejemplos en el artículo. Si estás empezando y no vas a usar muchos datos lo más sencillo es usar archivos OWL.
para exportar a almacenamiento persistente en que directorio va el driver de mysql pq me dice que no lo encuentra?
com.hp.hpl.jena.db.RDFRDBException: Failure to instantiate DB Driver:mysql java.sql.SQLException: No suitable Driver
hola ya solucione todo lo anterior tengo una neuva consulta , ya tengo mi modelo persistido en la bd , lo hice con 2 codigos distintos , tengo una duda ya que para hacer esto ocupe dos codigos distintos pq fui probando , en los dos me creo las tablas que jena proporciona a la BD ,en jena_g1t1_stmt me creo la ontologia , y en otro me creo esa tabla vacia … cual de las 2 es la correcta?
la tabla que indicas contiene los statements (las tripletas) de la ontología, incluyendo por tanto el modelo y los datos. De todas formas no tienes que acceder directamente a esas tablas, Jena te ofrece un API que te permite navegar por la información fácilmente y también puedes utilizar consultas SPARQL.
MUUUUCHAS GRACIAS PATXI
benas Tardes, estoy haciendo una tesis de grado de un vocabulario ontologico, ya tengo diseñada la ontologia en Protege quisiera me explicaran si no es mucha molestia paso a paso para utilizar el jena????? por favor ya tengo varios dias y no doy con la solucion.
Alguién q me oriente, quisiera un ejemplo en codigo de como ejecuto una Regla SWRL con la api Jena en Java.. Algún link q me recomienden? necesito ejecutar muchas reglas.Saludos
Hola Ricardo si lees esto tengo el problemas del driver de mysql que tu posteaste ya probe varias versiones del driver y nada como solucionaste ese problema te lo agradeceria
Julio:
Que tipo de error obtines? si te dice que no encuentra el driver mysql, renombra el driver que descargas de Mysql a: «driver.jar» y dejalo en la ruta de instalación de protegé y reinicia protégé. O cual es el error que tienes? a lo mejor alguién más te explica si eres más específico. Saludos.
Hola amigos:
Estoy creando una ontología sobre departamentos de una universidad y tengo una duda.
La estructura es la siguiente:
– tengo una clase llamada «Area» y dentro de ellas están las áreas que forman la universidad
– tengo otra clase llamada «Subarea» y dentro de ellas están todas las súbareas de la uni.
– tengo una clase llamada «Profesores». No tiene subclases pero sí individuos, que son los profesores.
– tengo una clase llamada «Especialidad». No tiene subclases pero sí individuos.
Para completar, un «Area» tiene «Subareas», que a su vez tiene «Profesores» con «Especialidades».
Mi duda viene ahora: no sé si lo habré hecho bien, pero cuando pregunto que me diga si hay algún Area cuyo profesor tenga una determinada especialidad no me devuelve ningún resultado.
En cambio, si pregunto que me diga si hay algún profesor con esa misma especialidad sí da resultados coincidentes.
Para mí que no consigo establecer la relación entre Area->Subarea->Profesor->Especialidad.
¿Me podéis ayudar? Muchas gracias. Quien lo necesite, puedo dejarle el archivo owl.
vice_45@hotmail.com
Aqui estoy de nuevo con otra pregunta.
Es posible realizar una consulta en SPARQL que me de todos los elemtos de una clase y los elementos de sus subclases.
por ejemplo, la clase persona, tiene las subclases, hombre y mujer, y estas a su vez mas subclases.
Como obtego todos los elementos de la clase persona?
porque con el:
?element rdf:type ?persona.
No me da resultados.
muchas gracias!
Hola, estoy implementando un sistema que interroga una ontologia, estaba trabajando con una ontologia de prueba y todo iba bien pero ahora cuando pruebo con cualquier otra me da el siguiente error:
WARN [main] (RDFDefaultErrorHandler.java:36) – file:///C:/Workspaces/MyEclipse%208.x/Agronomia/(line 26 column 67): {W102} Unqualified property attributes are not allowed. Property treated as a relative URI.
Exception in thread «main» java.lang.NullPointerException
at com.hp.hpl.jena.rdf.arp.impl.XMLHandler.endElement(XMLHandler.java:143)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLNamespaceBinder.handleEndElement(Unknown Source)
at org.apache.xerces.impl.XMLNamespaceBinder.endElement(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.hp.hpl.jena.rdf.arp.impl.RDFXMLParser.parse(RDFXMLParser.java:106)
at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:215)
at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:202)
at com.hp.hpl.jena.rdf.arp.JenaReader.read(JenaReader.java:272)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:196)
at com.hp.hpl.jena.ontology.impl.OntModelImpl.read(OntModelImpl.java:2089)
at Clases.Principal.Cargar_Ontologia(Principal.java:52)
at Clases.Principal.main(Principal.java:235)
Espero que me puedan ayudar.
Saludos.
Soy nuevo en esto de las ontologias y la web semantica alguien me podria donde puedo encontrar informacion como para principiante y empesar a enteder como es este mundo, Gracias
varios .owl que me enviaron, como hago para crear un repositorio con ellos y acceder a este
Hello:
Soy nuevo en esto de trabajo con ontologias y he estado probando el codigo que distes para cargar una ontologia desde un archivo owl y me da error cuando ejecuto el codigo en la parte del modelfactory,
que crees q sea eso?
tengo un problema al exportar la ontologia a MySQL, es un problema con el driver, no lo reconoce y llevo 3 semanas intentando solucionarlo, por favor si alguien sabe la solucion a este inconveniente, publiquelo.Gracias
hola:
He estado probando los codigos, la carga de la ontologia funciona bien pero la parte de la consulta no genera ningun resultado, me puedes hacer el favor de orientarme sobre la consulta con sparql.
Hola soy medico veterinario y me encuentro haciendo en mi tesis de maestría una ontología sobre higiene de productos cárnicos. ya tengo resuelta la esctructura conceptual del dominio en protégé pero no se como hacerle una interfaz donde se puedan hacer distintas consultas sobre los aspectos relacionados. lei el articulo de los experimentos con protégé pero no entiendo nada de jena y no he encontrado el protégé2jena por ningun lado pq el link q tienes no funciona al menos en mi red.
me gustaria contar con algun tutorial sobre estos temas pero q sea bein sensillo pq soy un aficionado a las PC pero no soy informático.
Xlu2
Hola Gerardo, el propio protégé permite introducir datos un una ontología y realizar consultas. Dependiendo del uso que se quiera puede ser suficiente.
Sin embargo ten en cuenta que protégé no es una herramienta amigable para introducir datos, por lo que es habitual crear aplicaciones que crean listados y formularios de edición amigables para los usuarios. Estas aplicaciones se programan con frameworks como Jena (entre otros). Sin embargo para realizarlas es necesario tener conocimientos de programación.
hola, soy Javier, no encuentro la manera de guardar mi ontologia en base de datos mysql con jena. Me puedes hacer el favor de ayudarme con eso, pues los codigos que he probado no me funcionan. Te lo agradezco.
Hola Javier, siento no poder ayudarte pero hace bastante que no trabajo con Protégé. Antes había un plugin que permitía exportar la ontología a base de datos, pero creo que ya no existe, supongo porque ahora Protégé es capaz de trabajar directamente con base de datos. Lo que no sé es cómo hacer para cargar en la base de datos una ontología que ya tengas creada, te recomiendo que consultes en las listas de soporte de Protégé.
Hola, quisiera saber como consulto con jena una ontologia guardada en una base de datos mysql. te agradezco tu ayuda
El plugin se llama protege2jena si mal no recuerdo
Buenos dias.
Estoy desarrollando una aplicación con ontologias.
Estoy tratando de hacer una aplicacion web, como se integra jsp, jena y pellet.
Cuando hago todo en jena y pellet funciona perfecto pero cuando tato de integrarlo en jsp me sale error
Muchas gracias
Oies que tal como puedo borrar una instancia y las instancias relacionadas como si fuera en cascada, te agradeceria tu respuesta
buenos dias
amigo sera que me podrias pasar el plugin protege2jena ya que en el sitio del post ya no esta disponible
muchas gracias
Buenas Noches
Cuando se esta actualizando una ontología y se quiere insertar un nueva propiedad por ejemplo hasName desde jena.
Como se verifica que esa propiedad no existe en la ontología para poder realizar la inserción