Skip to content

Jess. Conocer qué reglas se están disparando. (Rules Fired)

4 octubre 2009

Una de las cosas que más me inquietaban a la hora de trabajar con Jess, es que no había ninguna forma directa de conocer qué reglas estaba disparando en cada iteración. Puedes conocer fácilmente los resultados obtenidos tras cada inferencia (obviamente), pero no era tan fácil saber qué reglas se habían ejecutado para obtener esos datos.

La respuesta realmente no es difícil, pero hay que indagar un poco en la API de Jess y bucear otro poco en el código fuente de Protegé para dar con la solución.

Vamos a describir un poco la situación para que quede más claro lo que trato de exponer.

Tenemos nuestra aplicación en Java que utiliza la API de ProtegeOWL para el manejo de ontologías. Además estamos utilizando el lenguaje de reglas SWRL para definir reglas de producción que nos permitan inferir nuevo conocimiento en base a los datos almacenados en la ontología.

Al tener reglas SWRL en una ontología, necesitamos un motor de inferencia que nos permita disparar esas reglas y obtener nuevo conocimiento. Este motor en nuestro caso es Jess, que se integra a la perfección con Protégé y además nos proporciona una API para trabajar con él desde nuestro código Java. Aunque la idea es encapsular el manejo de código que haremos con Jess a través de la API de ProtegeOWL.

Bueno, sin más vamos a explicar la solución:

Tras leer varios hilos de la lista de correo de Jess, llegué a la conclusión de que la única forma que iba a tener para conocer el nombre de las reglas que se han disparado es utilizando “Listeners”. Jess lanza un evento cada vez que dispara una regla y en ese evento incluye información importante e interesante como por ejemplo: Nombre de la regla disparada y colección de hechos que han provocado que sea esa regla la que se ha disparado. Así es que lo único que hay que hacer es “Escuchar” a Jess para capturar los eventos que nos lance.

Y aquí llegaba el problema. Nosotros no tenemos acceso directo al objeto Rete que crea Jess (si recordáis usamos la API de ProtegeOWL para encapsular a Jess y utilizar los interfaces públicos de ProtegeOWL a través de un puente “Bridge”), sólo tenemos acceso a los métodos públicos definidos en el interfaz de ProtegeOWL. Pero, obviamente, ProtegeOWL sí tiene acceso directo al objeto Jess. ¿Qué hacemos? Muy simple, Modificar la clase de ProtegeOWL que se comunica con Jess y añadir los métodos que necesitamos.

Por si no queréis bucear en todo el código fuente de Protege para saber cómo se crea el objeto Jess y el Bridge, os diré que la clase que necesitáis modificar es: SWRLJessBridge.java, que está en el paquete:

edu.stanford.smi.protegex.owl.swrl.bridge.jess

Ahora sí, ya tenemos todo lo que necesitamos saber para poder capturar el nombre de las reglas que Jess dispara en cada iteracción:

– Capturamos el evento de Jess y añadimos nuestros métodos para manejar esos datos a: SWRLJessBridge.

Pero, ¿Cómo hacemos para capturar los eventos que nos lanza Jess? La respuesta la encontramos en la API del propio Jess (que os recomiendo que leáis). Si indagamos un poco por las clases que nos proporciona, veremos que hay un interfaz público que se llama JessListener y si entramos en su descripción veremos que nos dice que toda clase que quiera “escuchar” lo que dice Jess, debe implementar ese interfaz.

Además en la Documentación de JessListener nos dan un pequeño código de ejemplo para enseñarnos cómo capturar los diferentes tipos de eventos que puede lanzar Jess. Sin duda, nuestro punto de partida. Hay varios tipos de eventos, aunque en principio el que nos va a interesar es: JessEvent.DEFRULE_FIRED

A partir de aquí ya cada uno puede implementarlo de la forma más óptima para su aplicación. En mi caso he hecho lo siguiente:

  1. Necesitamos implementar el interfaz JessListener, así es que en mi caso, lo más directo era que la propia SWRLJessBridge lo implemente
  2. Añado el método eventHappened(JessEvent je); para cumplir con el contrato del interfaz y lo implemento como se indica en el ejemplo de la API (adaptando el código por supuesto). Ahora ya tenemos los nombres de las reglas a nuestro alcance
  3. Sólo nos queda enviar esos nombres a nuestra aplicación. Y aquí cada uno debe hacerlo de la forma que crea más óptima. En el ejemplo lo hacen mediante métodos estáticos para mostrar esta información por pantalla. Pero también podéis ir añadiendo los nombres de las reglas que van disparándose a un ArrayList, e implementar un método que te devuelva ese ArrayList. Ya os digo, aquí hay muchas posibilidades.

Disculpad que no os ponga nada de código esta vez, pero creo que es mejor comprender la idea y el objetivo y después que cada un@ lo adapte a los requisitos de su aplicación.

Si tenéis cualquier duda o sugerencia, no dudéis en preguntar.

Enlaces de interés:

Más info | Jess API

Lista de correo | Jess Mailing List

Instalar API ProtegeOWL | https://rekkeb.wordpress.com/2009/04/01/instalar-la-api-de-protegeowl-para-eclipse/

Anuncios
No comments yet

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: