Skip to content

Gestionar Imports de Ontologías. Protégé-OWL API

16 marzo 2009

Cuando trabajamos con ontologías, una de las formas más comunes de reutilizar datos entre ellas, es realizar imports. De esta manera añadiremos a nuestra ontología nuevos espacios de nombres, que nos van a permitir utilizar nuevos datos y ubicar y reconocer los datos existentes. Si ya habéis trabajado con reglas SWRL, os habréis dado cuenta de que, para poder crear reglas y manipularlas, es necesario llevar a cabo una serie de imports en nuestra ontología principal, que nos permita conocer los tipos de datos que se manejan en las reglas SWRL.

Si trabajais con Protégé, esta importación se lleva a cabo de forma automática simplemente pulsando un botón. Y el resultado es la adición de nuevas clases, propiedades e instancias a nuestra ontología.

En esta entrada veremos cómo añadir Imports y cómo eliminarlos de nuestra ontología usando la API Protégé-OWL.

La incorporación de nuevos imports a nuestra ontología es un proceso muy trivial. Muy simple. La incorporación de nuevos imports puede llevarse a cabo “al vuelo” sin necesidad de recargar la ontología. Vamos a ver cómo importamos una de las ontologías definidas por SWRL, por ejemplo.

Por supuesto, antes de nada, debemos asegurarnos de tener correctamente instalada la API de Protege-OWL en nuestro IDE. En mi caso estoy usando Eclipse 3.4.1 y la API de Protege descargada de los repositorios de Subversion.

Nota: Aquí podéis ver una guía de como instalar la API de Protege. Los ejemplos están puesto para Windows, pero funciona para cualquier plataforma. De hecho, yo en Windows no lo he probado jamás 😛

Nota: En esta entrada cuento cómo instalar y configurar la API. Aquí describo el método que yo uso, que no quiere decir q sea el único ni el mejor 😉

Una vez, tenemos todo configurado, veamos el código para realizar los imports:

//Creamos el modelo aux con la ontologia base
 JenaOWLModel jModel = ProtegeOWL.createJenaOWLModelFromURI(uri); //Puede lanzar una Exception
//uri será la ruta hacia nuestro fichero OWL que contendrá la ontología
//Si lo preferimos, podemos crear un modelo vacío con la siguiente instruccion:
//JenaOWLModel jModel = ProtegeOWL.createJenaOWLModel();

//Añadimos el espacio de nombres de la ontología que vamos a importar y le asignamos un prefijo
 jModel.getNamespaceManager().setPrefix(new URI("http://www.w3.org/2003/11/swrl#"), "swrl");

//Creamos un ImportHelper para llevar a cabo la importación
  ImportHelper importHelper = new ImportHelper((JenaOWLModel)jModel);

//Añadimos la ontología al conjunto de ontologías q van a ser importadas
//Este método NO realiza la importación de ontologías a nuestro jModel
  importHelper.addImport(new URI("file:///ruta/a/nuestra/ontologia/swrl.owl"));
//Añadiremos tantos .addImport como ontologías queramos importar
//(Por su puesto con sus correspondientes, espacio de nombres y prefijos)

//Ahora sí añadimos los imports q hemos estado configurando
  importHelper.importOntologies(false);
//El parámetro false indica que no recargue el GUI.
//Recordemos que la API de Protege, trae métodos para crear todo un interfaz de usuario completo

A partir de ahora ya tenemos importada la ontología y la tendremos incorporada a nuestro modelo. Por tanto podremos trabajar con ella sin ningún problema.

Recordemos que el método importOntologies, puede lanzar una excepción, asi es que debemos controlarla.

Veamos ahora la forma de eliminar un import. Esta acción puede no resultar tan trivial en primera instancia. Tenemos dos opciones para eliminar los imports:

1- Recargar todo el modelo OWL nuevamente

Una solución que he encontrado, consiste en realizar los siguientes pasos: (Ésta es la manera en la que la versión 3.3.1 de Protege elimina los imports)

  1. Eliminar el import del modelo. En este punto y mientras el modelo siga en memoria, el import y sus referencias todavía no habrán sido eliminadas. Estos cambios no son reflejados hasta que guardemos el modelo en un fichero en el disco.
  2. Eliminar los prefijos que hayamos creado.
  3. Guardar el modelo en un fichero OWL. Lo que provoca que el fichero OWL se actualice con la ontología SIN los imports que hemos eliminado antes
  4. Volver a cargar el modelo con el fichero que acabamos de guardar. Ahora sí, el modelo que tenemos en memoria no contiene los imports.

El código para llevar a cabo esta acción es el siguiente:

Primero necesitamos conocer la URL del import que vamos a eliminar, si no la conocemos, podemos obtenerla con: jModel.getAllImports()

jModel.getDefaultOWLOntology().removeImports("http://www.w3.org/2003/11/swrl.owl");
jModel.getNamespaceManager().removePrefix("swrl");

Collection errors = new ArrayList();
jModel.save(new URI("file:///ruta/al/fichero/owl/sinImports.owl"),
                                         FileUtils.langXMLAbbrev,errors);

//El siguiente paso es muy importante, ya que el mantener modelos de ontologias en memoria,
//requiere mucho espacio en la pila y como sabéis este espacio es bastante limitado.
//De esta forma le decimos a la JVM que puede eliminar el espacio ocupado por nuestro
//anterior modelo y evitar asi excepciones del tipo OutOfMemoryException :S
jModel.close();
jModel = null;

jModel = ProtegeOWL.createJenaOWLModelFromURI(
                      new URI("file:///ruta/a/fichero/owl/sinImports.owl").toString());

De esta forma habremos eliminado el import o los imports de nuestro modelo. Realmente funciona muy bien este método aunque su mayor inconveniente sin duda es el tiempo que se pierde en volver a cargar el modelo. Si hablamos de ontologías muy grande este tiempo puede ser en ocasiones exagerado.

2- Vaciar la caché sin recargar todo el modelo OWL:

Este segundo método funciona muy bien con la API 3.4 de ProtegeOWL. Con este metodo no es necesario que recarguemos nuevamente el modelo en memoria.

//Vaciamos la cache de nuestra ontología
((OWLModel)jModel).resetOntologyCache();
//Eliminamos los imports que nos interesen
jModel.getDefaultOWLOntology().removeImports("http://www.w3.org/2003/11/swrl.owl");
jModel.getNamespaceManager().removePrefix("swrl");
//Si ahora listamos los imports, veremos que el import que acabamos de eliminar
//no esta en nuestra ontologia.
System.out.println("Imports: "+jModel.getAllImports());

NOTA:Cuando hayamos realizado alguna operación sobre la ontología y después veamos que los datos que estamos obteniendo no corresponden a lo que deberíamos obtener, podemos vaciar la caché que utiliza Protegé para las ontologías sin necesidad de recargar todo el modelo.

Para más información consultad la API de Protege-OWL.

O visitad la página de Protégé, para estar atentos a novedades.

En esta lista de correo se propone otro tipo de solución.

Un poco de teoría sobre los imports en Protege | Protege-OWL Managing Imports

Comentarios, mejoras, sugerencias….

Anuncios
56 comentarios leave one →
  1. Antonio permalink
    20 agosto 2009 12:08

    Hola, soy nuevo en esto de las ontologias y falto de experiencia con las mismas, pero me han pedido que estudie sobre este tema y quiero saber si tendras un simple programa que me permita el manejo de una ontologia con reglas SWRL, o si sabes de un link donde pueda descargar uno
    Saludos

    • rekkeb permalink*
      20 agosto 2009 13:41

      Hola Antonio:
      No te preocupes, el tema de las ontologías es muy sencillo. Al principio resulta todo muy abstracto pero poco a poco te das cuenta de que es más sencillo de lo que parece.
      Para comenzar con SWRL te recomiendo que leas la API que proporciona Protégé para la creación y el manejo de reglas. Vienen algunos ejemplos interesantes.
      http://protege.cim3.net/cgi-bin/wiki.pl?SWRLAPI

      Dentro de toda la API, el módulo SWRLFactory es el que se encarga de gestionar las reglas SWRL a más bajo nivel. Aunque te proporciona una API de alto nivel para que te sea más fácil trabajar con las reglas.

      Echale un vistazo y si necesitas algo, ya sabes donde estoy 😉

  2. Antonio permalink
    20 agosto 2009 13:53

    Ohh!!! gracias!!! que rapida respuesta, empezare con esto por q ya llevo mucho tiempo y como tú dices a mi se me ha complicado esto de entender las ontologias y ahora me piden razonar usando reglas SWRL je bueno gracias por la información y saber que en este blog si responden
    Saludos

  3. Antonio permalink
    20 agosto 2009 18:32

    Hola me surgio una duda, las reglas SWRL es necesario que las especifiquemos en java o es posible que se editen en la SWRLeditor del Protege? q me pierdo!!!
    Saludos

    • rekkeb permalink*
      20 agosto 2009 20:54

      SWRLEditor te va a facilitar la creación de la sintaxis de las reglas SWRL. Con el vas a poder crear reglas de una manera más o menos sencilla y añadirlas a una ontologia mediante Protege.
      Luego, esas reglas las puedes leer desde tu aplicación Java. Las reglas SWRL se almacenan a nivel de instancias, es decir que una vez que creas una regla y la añades a la ontología, ésta se almacena como un OWLIndividual.
      Lo ideal es que estas reglas las manipules y las crees desde tu programa en java. Hay una clase que se llama SWRLParser que te va a permitir escribir una regla como un String y después validarla mediante el método parse(String);
      Es la manera más sencilla de añadir reglas a tu ontología.

      Necesitas:
      – La ontología cargada en un JenaOWLModel (o un modelo vacío)
      – Un SWRLFactory con el que podrás manipular las reglas
      – Y El SWRLParser al que le pasaras en el constructor el JenaOWLModel anterior, con el que podrás añadir las reglas a la ontología.

      No estoy seguro de haber respondido a tu pregunta. Lo que te cuento aqui es lo que recuerdo. Por eso no puedo ser más específico. Ahora tengo un poco de lado el tema de las reglas, pq estoy centrándome en otras cosas.

      A ver si te sirve.

  4. Antonio permalink
    21 agosto 2009 00:13

    Muchas gracias por la información avance mucho con tú ayuda el día de hoy, estoy ya creando una pequeña regla y la aplicare a la ontologia, la duda q me surge es como sabre la inferencia obtenida por la misma, sabes como hago esto, y otra es q en la pagina del Protege no encuentro el SWRLParser.
    GRacias por tu ayuda

    • rekkeb permalink*
      21 agosto 2009 11:41

      SWRLParser está en el paquete:
      edu.stanford.smi.protegex.owl.swrl.parser.SWRLParser;

      Que está incluido en la API de Protégé.

      Para conocer y utilizar el conocimiento que adquieras, está el módulo SWRLRuleEngineBridge, que tiene métodos que te va a permitir inferir conocimiento nuevo. http://protege.cim3.net/cgi-bin/wiki.pl?SWRLRuleEngineBridgeFAQ

      Por supuesto para ello necesitas además un motor de inferencia. Personalmente utilizo Jess. Es increiblemente rápido y estable. Funciona genial.
      El único inconveniente es que no es libre, pero realmente si vas a trabajar con este tema a fondo, te merece la pena adquirir una licencia.
      De todas formas puedes probarlo durante 1 mes sin problemas.
      http://herzberg.ca.sandia.gov/

      Ánimo que ya dentro de nada lo tienes dominado 😉

  5. Antonio permalink
    21 agosto 2009 14:36

    Hola si ya descargue Jess adquiri la licencia de estudios un añito jeje, me he perdido un poco pero tratare de seguir con esto,
    Cree mi regla en java de la siguiente manera:

    SWRLImp imp = factory.createImp(“Person(?x) ^ hasSibling(?x, ?y) ^ Man(?x) -> hasBrother(?x,?y)”);
    A esta le tengo q aplicar el SWRLParse??? y de aqui como logro cargar esta regla a mi una ontologia?? q de ahi no puedo avanzar, espero me puedas ayudar más de lo q ya lo haces, saludos

  6. rekkeb permalink*
    22 agosto 2009 13:02

    Bien, vamos por partes entonces. Voy a escribir unas cuantas líneas de código que pretenden servirte a modo de guía para que te orientes, que sé lo perdido q se está al principio. Estas líneas de código no tienen porque compilar ni nada, mas que nada un paso a paso muy básico ok?

    1- Cargamos el modelo: Vacío para ir añadiendo poco a poco instancias, propiedades etc… o desde un fichero que ya contenga una ontología.
    JenaOWLModel jModel = ProtegeOWL.createJenaOWLModel(); //Lo crea vacío
    //Si queremos cargar de un fichero:
    jModel.load(“URI con la ruta del fichero”, FileUtils.langXMLAbbrev);

    2- Inicializamos el Factory y el Parser para manejar SWRL
    SWRLFactory factory = new SWRLFactory(jModel);
    SWRLParser parser = new SWRLParser(jModel);

    3- Creamos una regla y la añadimos a la ontología.
    Para crear la regla podemos usar un String, o irla contruyendo poco a poco como un objeto. Con un String es tremendamente fácil.
    String regla = “Person(?x) ^ hasSibling(?x, ?y) ^ Man(?x) -> hasBrother(?x,?y)”;
    //Creamos un nombre para la regla (no es obligatorio, ya que se añade automaticamente)
    SWRLImp imp = factory.createImpWithGivenName(“ReglaPerson”);
    parser.setParseOnly(false);
    parser.parse(regla, imp);

    Si la regla está bien cronstruida y es válida, quedará añadida a la ontología. Si no, el método parse() lanzará una excepción en la que te devolverá un mensaje indicándote que es lo que está fallando en la validación

    4- Ya sólo queda ejecutar el motor de inferencia. Para ello:
    //Creamos una estructura de tipo Bridge y le decimos que use Jess:
    SWRLRuleEngineBridge bridge = BridgeFactory.createBridge(“SWRLJessBridge”,jModel);

    //Inicializamos el bridge y lo cargamos con los datos de la ontologia + las Reglas SWRL
    bridge.reset();
    bridge.importSWRLRulesAndOWLKnowledge();
    //Ejecutamos el bridge con todas las reglas leidas
    bridge.run();

    //En este punto, el bridge tendrá almacenados todas las nuevas inferencias que ha llevado a cabo, si hay alguna. Sólo nos queda añadirlas a la ontología.
    bridge.writeInferredKnowledge2OWL();

    Con esto conseguirías un comportamiento similar a como lo hace Protégé. Luego por supuesto puedes indagar mucho más en cada método y desglosar mucho más este programa. Al fin y al cabo muchas de las funciones que te escribo aquí lo que hacen es llamar a otras funciones y agruparlas.

    Échale un vistazo si quieres a la API de SWRLRuleEngine: http://protege.stanford.edu/protege/3.4/docs/api/owl/edu/stanford/smi/protegex/owl/swrl/SWRLRuleEngine.html

  7. Antonio permalink
    23 agosto 2009 20:38

    hola, empece con tus recomendacio siguiendo paso a paso, pero me sale un error en la siguiente linea de codigo,

    URI = “C:/Toño/Ontologias/SWRL/family.swrl.owl”;
    jModel.load(URI, FileUtils.langXMLAbbrev);

    donde me manda la siguiente leyenda
    “the method load (URI,String) in the type JenaOwlModel is not applicable for the Arguments (String, String) y no entiendo por que

    Y despues lo escribi a como venia haciendolo q es

    FileInputStream input=new FileInputStream(“C:/Toño/Ontologias/SWRL/family.swrl.owl”);
    JenaOWLModel owlModel = ProtegeOWL.createJenaOWLModelFromInputStream(input);

    SWRLFactory factory = new SWRLFactory(owlModel);
    SWRLParser parser = new SWRLParser(owlModel);

    String regla = (“Person(?x) ^ hasSibling(?x, ?y) ^ Man(?x) -> hasBrother(?x,?y)”);

    SWRLImp imp = factory.createImpWithGivenName(regla);
    parser.setParseOnly(false);
    parser.parse(regla, imp);

    SWRLRuleEngineBridge bridge = BridgeFactory.createBridge(“SWRLJessBridge”,owlModel);

    bridge.reset();
    bridge.importSWRLRulesAndOWLKnowledge();
    //Ejecutamos el bridge con todas las reglas leidas
    bridge.run();

    //En este punto, el bridge tendrá almacenados todas las nuevas inferencias que ha llevado a cabo, si hay alguna. Sólo nos queda añadirlas a la ontología.
    bridge.writeInferredKnowledge2OWL();

    System.out.println(“Inferred Individuals :”+bridge.getInferredIndividuals());

    Para que segun yo me imprimiera el resultado de la inferencia, pero me aparece la ventana de Jess
    Tú sabes por que
    Saludos y gracias por la enorme ayuda

  8. Antonio permalink
    23 agosto 2009 20:55

    me falto comentarte jjeje q puse la siguiente linea de código para imprimir las inferencias

    System.out.println(“Inferred Individuals :”+bridge.getInferredIndividuals());

    pero como t explico en el anterior post, solo me aparece q se esta ejecutando Jess

    Jess, the Rule Engine for the Java Platform
    Copyright (C) 2008 Sandia Corporation
    Jess Version 7.1p2 11/5/2008

    This copy of Jess will expire in 333 day(s).
    Jess>

    En q estoy fallando
    Saludos

  9. rekkeb permalink*
    24 agosto 2009 09:21

    El primer fallo es bastante claro. Te dice que a jModel.load() debes pasarle como primer parámetro una URI, que es un objeto java.net.URI y como segundo parámetro un String y tu estás pasándole 2 String. Prueba a generar una URI con el primer String que contiene la ruta al fichero. Revisa como se construyen las URIs en Java, es muy sencillo.

    El segundo fallo ya es un poco más extraño. En mi proyecto no generamos nuevas instancias y por tanto nunca había usado ese método. Pero por lo que veo te devuelve un conjunto (Set) de OWLIndividuals. Prueba a recorrer el conjunto e ir mostrando uno a uno cada OWLIndividual. Los OWLIndividual son las instancias de la ontología y tienen un método que se llama getBrowserText() o getLocalName() (no recuerdo exactamente) que te devuelve un String con el nombre de la instancia.
    Aunque es recomendable que primero compruebes si realmente ha obtenido nuevas instancias con el método: bridge.getNumberOfInferredIndividuals() que debería devolver un valor > 0.

    Prueba a ver.

  10. Antonio permalink
    25 agosto 2009 22:43

    Hola, ps arregle lo de la URI pero ahora cuando ejecuto el programa sigue apareciendo la consola de jess y no se ahora el por que, alguna idea?
    saludos
    PD.
    Nunca tuviste problemas como este?

    • rekkeb permalink*
      25 agosto 2009 22:53

      Pues la verdad es que nunca me ha salido la consola de Jess.
      ¿Cómo añades Jess a tu proyecto? Yo simplemente añado la librería jess.jar, todos los demas ficheros que hay en el zip de Jess no los uso para el proyecto java.

  11. Antonio permalink
    25 agosto 2009 22:57

    igual solo añado ese jar al proyecto, y eso es ahora lo que me detiene ya que no puedo visualizar si se esta realizando la inferencia

  12. rekkeb permalink*
    26 agosto 2009 12:23

    Se me ocurre que puedes probar el metodo bridge.infer();

    Este método hace lo mismo que lo que te escribí en la otra respuesta. Es decir, agrupa las llamadas a: reset(), importSWRLandOWLKnowledge(), run() y writeInferredKnowledge2OWL()

    Por tanto sería, crear el bridge y llamar a infer().

  13. Antonio permalink
    26 agosto 2009 15:29

    hola ya probe tambien con ese metodo y me pasa igual, asi que ahora estoy tratando de encontrar el pequeño error jeje gracias por tu ayuda ya t dire cuando lo encuentre 🙂 a este paso tendre q invitar las birras jaja

  14. Antonio permalink
    26 agosto 2009 19:51

    he podido ejecutar el programa, ya voy avanzando pero ahora tengo un error de compilacion el cual es

    Exception in thread “main” edu.stanford.smi.protegex.owl.swrl.bridge.jess.exceptions.SWRLJessBridgeException: Jess reported an error in routine Jesp.parsePattern.
    Message: Expected template name at token ‘?x’.
    Program text: ( defrule http://a.com/ontology#Person ( ?x at line 1 in file .

    Estoy usando la ontologia family.swrl.owl que es la que esta como ejemplo en la pagina de Protege sobre este tema. Pero no se a q se refiere
    Saludos
    El problema de la ejecución era por un error en el claspath

  15. Antonio permalink
    2 septiembre 2009 21:20

    Hola
    Regresando de un breve descanso a retomar esto, me ha surgido una duda que me ha comido el cerebro, es posible agregar las reglas SWRL desde la ontologia misma? sin necesidad de agregarlas como tenia pensado?
    También esto se realiza en una misma ontologia o en dos?, una con la información y otra con las reglas?
    Saludos

  16. Antonio permalink
    4 septiembre 2009 16:20

    Hola
    De nuevo escribiendo, ya quedo el tema de la inferencia con las reglas SWRL en java, al menos ya obtuve los mismos resultados que obtenia en la palataforma del Protege y ahora los tengo ya con codigo Java. Mi pregunta ahora sería y no se si puedas ayudarme, Para obtener la nueva ontología con las inferencias aplicadas es necesario aplicar un razonador para revisar la consistencia de la ontologia? o como se hace?
    Saludos y gracias por todo

    • rekkeb permalink*
      4 septiembre 2009 20:03

      Una vez que has obtenido el nuevo conocimiento y lo has añadido a la ontología, se actualiza la ontología que tienes en memoria. Si quieres actualizar el fichero .owl que almacenas en disco, sólo tienes que llamar al método save del jModel.
      En principio, no es necesario que utilices un razonador para comprobar la integridad de la ontología, aunque puedes hacerlo perfectamente sin ningún problema, así te aseguras de que la ontología siga siendo consistente.

  17. jani permalink
    23 febrero 2010 18:55

    Hola, tengo que hacer un trabajo para la uni sobre ontologías y di con tu página, la verdad me parece muy abstracto todo y no se como empezar, recién he empezado y estoy instalando Protege y Jess, es un gusto que uses también un Mac, ya me estaba asustando que no iba a encontrar herramientas que funcionarán para este trabajo.

    Saludos.

  18. Romero permalink
    16 marzo 2010 21:45

    Hola… Yo estoy trabajando con ontologias, ya cree mi ontologia en protege y tengo mi archivo .owl, ahora quiero proceder a trabajar con ese archivo manipularlo cargarlo desde java ; leerlo, agragar individuos, des una interfaz qe yo haga en java, ya se netbeans o eclipse, pero creo qe el primer paso es cargarla en memoria para trabajr con ella. como logro eso??

    • rekkeb permalink*
      1 octubre 2010 09:20

      Hola, lo primero disculpa por la tardanza en contestar, se me había pasado este comentario y no me había dado cuenta que no lo había contestado.
      Lo primero como bien dices es cargar la ontología en memoria, a partir de ahí puedes manipularla todo lo que necesites. Para cargar una ontología que se encuentra en un fichero OWL previamente creado, es tan sencillo como:

      OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
      //Lo cargamos
      model.read(uriOnto,”RDF/XML”);

      Donde ‘uriOnto’ es la URI completa hasta el fichero OWL en disco.

      Te invito a que eches un vistazo a esta entrada de mi blog, donde cuento cómo añadir propiedades e instancias a la ontología.

      https://rekkeb.wordpress.com/2010/05/10/gestiona-ontologias-con-jena/

  19. jesus permalink
    1 octubre 2010 00:36

    hola.. soy nuevo en el tema de las ontologias ,mi inquietud es la siguiente:
    ¿Que diferencia hay entre SWRL y JESS ? ¿una es mejor que otra ? ¿ se complementan?

    • rekkeb permalink*
      1 octubre 2010 09:13

      No, no son lo mismo. SWRL es un lenguaje (Semantic Web Rule Language) y Jess es un motor de inferencia capaz de trabajar con el lenguaje SWRL. Sería como Java y la JVM.

  20. Martin Vasquez permalink
    6 octubre 2010 23:28

    Hola me interesa saber si existe alguna API o algo para visualizar una ontologia de modo grafico desde una aplicacion personal Java. como puedo hacer esto ?.. LA API OWL Protege lo permite ??

    • rekkeb permalink*
      7 octubre 2010 09:50

      Pues la verdad es que siempre que he necesitado un interfaz gráfico para mostrar una ontología, lo he implementado utilizando Swing o JavaScript, la verdad es que desconoczco si existe alguna API para realizar esta tarea, pero la verdad es que sería de lo más interesante.
      Si quieres, puedes echar un vistazo al código de Protege, la zona UI y ves cómo lo hacen ellos. Si averigüas algo, estaremos encantados de que nos lo cuentes 😉

  21. 2 noviembre 2010 00:25

    Hola,

    He leído tu post y me parece bastante interesante. Estoy buscando información precisamente sobre la importación de ontologías, pero más bien, quiero saber como funciona el import en cada API (supongo que variará de si usas OWL API, Jena, Protege API, …).

    Mis dudas son relacionadas básicamente sobre las limitaciones del import. ¿Sabes si cuando se hace el import (en la API que tu usas), cuando se genera el modelo en memoria de la ontología, este modelo incluye un submodelo de la ontología importada?

    Lo pregunto de cara a la complejidad espacial (y temporal, claro) que esto pueda suponer, pudiendo llegar a tener problemas de memoria si tratas de importar ontologías demasiado grandes.

    Agradecería si tienes información sobre esto (algún paper, referencia, o simplemente si sabes esto por la práctica) 🙂

    Un saludo

    • rekkeb permalink*
      2 noviembre 2010 11:17

      Hola Alejandro:
      Realmente no tengo ningún paper ni documentación que hable sobre ese tema. Pero sí puedo contarte mi experiencia propia con los imports. Tanto en la API de Protege, como en Jena, cuando dispones de una ontología A.owl e importas una ontología B.owl, ambos modelos quedan cargados en memoria.
      Podría llegar a darse el caso de que ambas ontologías sean muy grandes y no quepan en memoria (yo hasta ahora no lo he conseguido 🙂 ) obteniendo un bonito OutOfMemoryException proveniente de tu VM.
      Obviamente la complejidad espacial y temporal aumentará conforme importes más ontologías dentro de A.owl, ya que al fin y al cabo, lo que estás consiguiendo es una ontología con una taxonomía más rica en conocimiento y más compleja en clases, restricciones, instancias…
      Espero haberte servido de ayuda.

      Saludos!

  22. 2 noviembre 2010 11:21

    Hola rekkeb,

    Muchas gracias por tu respuesta, era un poco lo que imaginaba. En mi caso creo que si que podría llegar a tener problemas de memoria, ya que la idea es usar la taxonomía de SNOMED en formato OWL, importarla, y acceder entonces a unos determinados términos que yo voy a necesitar en mi ontología. He leído un paper donde con una máquina que ahora mismo no recuerdo el procesador, pero que con 4GB de memoria tomaba 4h de carga, pero tanto temporal como espacialmente eso a mi se me va de las manos.

    Gracias!

    • rekkeb permalink*
      2 noviembre 2010 11:37

      4 horas de carga son muchas horas sin duda, no me extraña que se te vaya de las manos.
      Supongo que ya conocerás este enlace, pero te lo dejo por si te sirve para aclarar un poco el tema de los imports. Trata sobre cómo se gestionan los imports en Protege:

      http://protege.stanford.edu/doc/owl/owl-imports.html

      Un saludo y ánimo 😉

  23. esme123 permalink
    21 junio 2011 06:30

    hola rekkeb…. he leido tu post y me parece realmente interesante, además de que es lo que necesito para mi trabajo de grado, quisiera saber si tienes algún codigo en java que haga lo que anteriormente explicas (ps que importe una ontologia sencilla a java?), ya que soy nueva en el asunto de Ontologias y la verdad no quisiera preguntarte cosas que puedo ir estudiando……..
    Muchas Gracias!!!

  24. esme123 permalink
    21 junio 2011 06:34

    hola rekkeb…. he leido tu post y me parece realmente interesante, además de que es lo que necesito para mi trabajo de grado, quisiera saber si tienes algún codigo en java que haga lo que anteriormente explicas (ps que importe una ontologia sencilla a java?), ya que soy nueva en el asunto de Ontologias y la verdad no quisiera preguntarte cosas que puedo ir estudiando……..
    Muchas Gracias!!!

    de nuevo pregunto pq equivoq mi correo

    • rekkeb permalink*
      23 junio 2011 23:05

      Hola esme, encantado de que leas mi blog. No comprendo bien tu pregunta ya que en el código de arriba muestro cómo importar las ontologías. Realmente no hay mucho más que hacer, con esas pocas lineas de código consigues que tu ontología importe aquellas otras ontologías que necesites. Una vez que las tienes importadas, puedes utilizar y acceder a todas las clases y propiedades de las nuevas ontologías como si fueran propias.
      Un saludo!

  25. esme123 permalink
    31 agosto 2011 03:21

    hola rekkeb… te vuelvo a escribir después de tanto tiempo, apenas retomo el tema de ontologías . Te agradezco por la anterior respuesta, no sabia que me habías respondido…

    A mi me interesa más que la generación de la ontología, es su razonamiento, así que en tu post mencionas bastante a jess. Has usado alguna vez pellet, racer o fact++?.Quisiera que me comentaras al respecto porq debo evaluar el procesamiento que hacen para inferir un ontologia. Por otro lado quisiera que me ubicaras en algún tutotial o documentacion de como podria ir empezando a realizar la inferencia con jess en jena???..

    MUCHAS GRACIAS

  26. esme123je permalink
    31 agosto 2011 05:43

    otra vez yo…te cuento q intento instalarlo como dice aqui
    http://www.jessrules.com/doc/70/eclipse.html

    …pero cuando quiero crear el archivo .cpl, no me deja.. verifiqué y aparece el plugin llamado gov.sandia.jess pero no el icono q mencionan ..
    GRACIAS

  27. esme123je permalink
    2 septiembre 2011 04:33

    otra vez yo… te cuento que ya solucioné el inconveniente que publiqué anteriormente, estoy orientándome con la pagina principal y he entendido varias cosas. Voy en la parte de “Making Your Own Rules”, pero no entiendo en que parte se hace la inferencia como tal , podrías orientarme al respecto?…GRACIAS

    • rekkeb permalink*
      7 septiembre 2011 08:59

      Hola esme, disculpa la tardanza en contestar, pero ultimamente he estado desconectado, a ver si retomo la actividad en el blog. Debo decirte que en este tema me temo que no voy a poder ser de mucha ayuda. Nunca me ha interesado mucho el lenguaje Jess. Mi uso con Jess se ha limitado a utilizar su potencia para inferir nuevos datos provenientes de las reglas SWRL y utilizar el “traductor” de Protege para interactuar con Jess. Comprendo que Jess utiliza una sintaxis muy parecida (si no igual) a LISP, pero realmente nunca he necesitado ahondar mucho en su lenguaje interno.
      Lo que puedo comentarte es cómo funciona Protege en este tema (que imagino que ya lo sabrás). Las inferencias en Protege utilizando Jess se realizan en tres pasos: Un primer paso de traduccion de las reglas SWRL a Jess; Un segundo paso de ejecución de Jess y obtención de los datos; y el tercero que consiste en traducir estos datos generados por Jess a OWL y añadirlos a la ontología.
      En ese segundo paso, creo que los datos quedan almacenados en una memoria intermedia que habilita el propio Jess, asi es que imagino que cuando ejecutes las reglas directamente desde Jess, ocurrirá algo parecido.
      Lamento no poder orientarte mucho en esta ocasión.
      Un saludo!!

  28. pipex80 permalink
    7 septiembre 2011 00:30

    te cuento que intento hacer lo que indicas en uno de tus comentario al trabajar con swrl y jess pero no se porque la clase BridgeFactory (no me la deja importar) no se encuentra en la libreria de protege-owl, yo descargue la version 3.4.7 he hice lo que indicabas en otro post sobre compilar la libreria para que no quede tan pesado nuestro proyecto. Revisé y no se encuentra dentro del paquete respectivo, te agradeceria mucho si me colaboras con ello…Gracias

    • rekkeb permalink*
      7 septiembre 2011 09:02

      Hola pipex80. Efectivamente la clase BridgeFactory desapareció de la API de protege en la versión 3.4.3 – 3.4.4. Es un tema que me sorprendió y que pensé en investigar cuando tuviera tiempo, más que nada para poder adaptar esta entrada a las nuevas versiones de la API, pero lo tengo un poco descuidado por falta de tiempo.
      La versión de la API que yo utilizo actualmente es la 3.4.1, con la que he comprobado que todo funciona.
      Si algo he aprendido trabajando con la API de Protege es que cada cambio de versión, por mínimo que sea puede hacer que nada de lo que tengas funcione como lo hacía antes. Antes de actualizar a cada versión, te recomiendo que lo hagas con precaución y en un proyecto a parte. 😉

      Saludos!

  29. pipex80 permalink
    7 septiembre 2011 05:43

    ya solucioné el anterior inconveniente pasandome a la version 3.4.4…. hay mucha diferencia con la 3.4.7?…. compilo la clase que cree tal y como lo indicas pero obtengo lo siguiente:

    Exception in thread “main” java.lang.NoClassDefFoundError: org/protege/editor/owl/model/hierarchy/roots/Relation
    at edu.stanford.smi.protegex.owl.jena.parser.TripleProcessor.(TripleProcessor.java:61)
    at edu.stanford.smi.protegex.owl.jena.parser.GlobalParserCache.getTripleProcessor(GlobalParserCache.java:74)
    at edu.stanford.smi.protegex.owl.jena.parser.ProtegeOWLParser.loadTriples(ProtegeOWLParser.java:290)
    at edu.stanford.smi.protegex.owl.jena.parser.ProtegeOWLParser.loadTriples(ProtegeOWLParser.java:257)
    at edu.stanford.smi.protegex.owl.repository.impl.AbstractStreamBasedRepositoryImpl.loadImportedAssertions(AbstractStreamBasedRepositoryImpl.java:64)
    at edu.stanford.smi.protegex.owl.model.impl.AbstractOWLModel.loadImportedAssertions(AbstractOWLModel.java:415)
    at edu.stanford.smi.protegex.owl.model.util.ImportHelper.importOntologies(ImportHelper.java:145)
    at Import.main(Import.java:52)
    Caused by: java.lang.ClassNotFoundException: org.protege.editor.owl.model.hierarchy.roots.Relation
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    … 8 more

    no entiendo cual es el problema.Podrias ayudarme porfavor?.
    gracias

    • rekkeb permalink*
      7 septiembre 2011 09:11

      Obviamente falta alguna clase que Protege no es capaz de encontrar, pero bueno, esto ya lo sabía y comprendo que no te soluciona nada.
      Si te fijas, el tema de los imports es un poco “delicado”. De la versión 3.3 de Protege a la versión 3.4 hay bastante diferencia en la manera de realizar los imports, por tanto no me extrañaría nada que en las nuevas versiones de la API hayan cambiado más cosas.
      Cuando me ocurren este tipo de inconvenientes suelo recurrir al mismo truco que suele ser muy efectivo: Si mi código no funciona, voy a ver el suyo directamente para saber qué han cambiado y cómo adaptar mi código. Tan “sencillo” como descargarse el código fuente de Protege y buscar lo que necesitas 😉

      Saludos!

  30. pipex80 permalink
    12 septiembre 2011 00:36

    hola rekkeb, estaba compilando un pequeño código, creado como orientas en uno de los anteriores comentarios.Logré solucionar el error que me aparecia y que escribi en mi anterior comentario, descargando un paquete que hacia falta (orphanNodesAlg.jar) pero ahora me sale un error que no se a que se refiere. Este es el siguiente:

    Exception in thread “main” edu.stanford.smi.protegex.owl.swrl.parser.SWRLParseException: Invalid atom name ‘Person’.
    at edu.stanford.smi.protegex.owl.swrl.parser.SWRLParser.parseAtom(SWRLParser.java:208)
    at edu.stanford.smi.protegex.owl.swrl.parser.SWRLParser.parse(SWRLParser.java:162)
    at Import.main(Import.java:66)

    estoy utilzando el ejemplo de famiy.swrl.owl, en donde eliminé la siguiente regla y la intento añadir en java:

    String regla = “Person(?x) ^ hasParent(?x, ?y) ^ hasBrother(?y, ?z) -> hasUncle(?x, ?z)”;

    Estoy trabajando con la version 3.4.1 de protege-owl donde si aparecía la clase BridgeFactory. Quisiera saber que esta pasando…. te agradeceria mucho si me orientas al respecto..

    GRACIAS

  31. pipex80 permalink
    12 septiembre 2011 00:50

    ahh y gracias por la respuesta y orientación que me diste en los anteriores comentarios. Por otro lado me encontré un ejemplo que intente probar pero me aparece un error en el import de la siguiente clase
    edu.stanford.smi.protegex.owl.swrl.bridge.jess.exceptions.JessSWRLRuleEngineException;

    y es que en la versión que te decía (3.4.1), no aparece esta clase (ni el paquete jess dentro esa extensión que se ve ahí). Busqué en todas las versiones que me descargue (superiores a la 3.4), pero ninguna la tiene.Este es el link del ejemplo:

    http://smi-protege.stanford.edu/repos/protege/swrl-jess-bridge/trunk/src/edu/stanford/smi/protegex/owl/swrl/bridge/jess/InvokeSWRLBuiltInUserFunction.java.

    De nuevo te agradeceria si me orientas al respecto (depronto conozcas en que version de protege-owl pueda encontrar esa clase), y si haz trabajado con esa clase para saber si es realmente util y necesaria…porque tu la nombras en el post acerca de Jess: Conocer qué reglas se están disparando. (Rules Fired)

    • rekkeb permalink*
      17 octubre 2011 22:09

      Hola pipex.
      Respondo tardísimo a este comentario, pero por alguna razón no lo he leído hasta ahora. Disculpa.

      La clase que buscas se encuentra dentro del paquete swrl-jess-bridge.jar
      Aqui puedes encontrar su rama de SVN:
      http://smi-protege.stanford.edu/svn/swrl-jess-bridge/trunk/src/edu/stanford/smi/protegex/owl/swrl/bridge/jess/

      Saludos!

  32. pipex80 permalink
    14 septiembre 2011 02:10

    para esta ocasion decidi no agregar reglas desde eclipse para ver si ese era el problema, pero me aparece la siguiente excepcion:
    Exception in thread “main” edu.stanford.smi.protegex.owl.swrl.bridge.exceptions.InvalidBridgeNameException: SWRLJessBridge
    at edu.stanford.smi.protegex.owl.swrl.bridge.BridgeFactory.createBridge(BridgeFactory.java:95)
    at Import.main(Import.java:72).

    Intente descargar el jar swrl-jess-bridge de esta pagina:
    http://smi-protege.stanford.edu/svn/swrl-jess-bridge/trunk/, tal y como lo indica la página principal de swrl (http://protege.cim3.net/cgi-bin/wiki.pl?SWRLJessBridge), pero no deja descargar. Tendrias el .jar para que me lo facilitaras porque tal y como lo dice la página en el paquete-owl no se encuentra….. o me podrias orientar sobre mi problema…GRACIAS

  33. ludmila permalink
    17 octubre 2011 06:10

    Hola: mi libreria de Jess expiro, tu sabes como habilitarla.gracias

    • rekkeb permalink*
      17 octubre 2011 21:57

      Hay varias formas:
      – Puedes volvera descargarla. Con lo que tendrás un mes más de prueba.
      – Si eres estudiante, puedes solicitar una licencia academica de un año. Escribes al equipo de desarrollo de Jess y ellos te envian un usuario y password sin ningún problema.
      – Puedes adquirir una licencia pagando su importe. Esta ya no caduca.

      Saludos!

  34. wondersito permalink
    26 abril 2012 21:24

    tengo problemas ya que al parecer esta libreria utiliza owl, yo necesito a una ontologia n3 importarle una owl … no se como podria resolverlo, por cierto gracias por las respuestas anteriores, saludos

    • rekkeb permalink*
      27 abril 2012 22:54

      Vaya, me temo que ahi no puedo ayudarte. Nunca he utilizado las ontologíás n3 …

  35. wondersito permalink
    17 mayo 2012 20:02

    Que tal amigo, todo funciona bien pero cuando renombro un archivo y quiero volver a correr el programa (ya con el cambio de nombre en el código) no funciona, no se si dentro del código de la ontología venga incrustado el nombre del archivo, si renombro el archivo a su nombre original vuelve a funcionar. No se si sepas algo al respecto, saludos.

    • rekkeb permalink*
      19 mayo 2012 18:55

      Hola, pues esto que me comentas me parece muy extraño. Que yo sepa dentro de la ontología no queda almacenada ninguna referencia al nombre del fichero Owl (no creo que tuviera mucho sentido). Donde sí se guardan referencias al nombre del fichero OWL, es en el fichero .pprj que también crea Protege. Pero si utilizas sólo el fichero OWL, no deberias tener ese problema…

  36. Natalia permalink
    24 mayo 2012 03:33

    Hola, quería saber si tenías alguna idea de cómo crear los archivos .pprj desde código java, ya que busco dentro del código de protege pero no logro encontrar cómo hacerlo. Gracias

  37. adma permalink
    21 noviembre 2012 00:22

    Hola, el motivo de este comentario es para preguntarles si tienen alguna idea de como escribirle a una ontogia con la owl.api, lo que les quiero decir es poder modificar datos, agregar y eliminar cualquier informacionnen la ontologia desde java.

  38. Manuel permalink
    20 abril 2015 07:16

    ¿dónde puedo descargar las herramientas necesarias para trabajar con ProtegeOWL sin que sea a través del subversion?, es decir, necesito un link donde pueda dar click y se descargue. Por otras razones no puedo acceder a los repositorios oficiales donde hay que hacerlo a través de la herramienta subversion.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: