Frameworks y Ontologías (Parte 1)

El concepto de Ontologías viene desde hace un tiempo tomando fuerza en el mundo de los sistemas de información. Todos o una gran mayoría de ustedes tienen que haber escuchado mencionar el término “Web Semántica”. A grandes rasgos este proyecto trata de dotar de semántica a las páginas web que conocemos actualmente con el motivo de hacer búsquedas más elaboradas en donde el agente que está buscando no obtenga resultados que no sean de interés. Al mismo tiempo se busca lograr interoperatibilidad entre sistemas de información.

La pregunta es: ¿Cuál es el rol que tienen las ontologías? La respuesta es sencilla, la información semántica anexada a la Web necesita de algún formalismo, es ahí donde interviene el término ontología. Una ontología hace referencia a la conceptualización exhaustiva y rigurosa de un dominio determinado facilitando la comunicación y la compartición de información entre diferentes sistemas.

De esta manera es como aparecen los frameworks que hoy conocemos, RDF, RDF Schema y OWL, los cuales nos permiten definir los metadatos necesarios en forma de ontologías.

Este tutorial no intenta brindar un marco teórico al tema de Ontologías, como tampoco pretende abordar tópicos relacionados a las distintas metodologías que existen para de creación de éstas. Pero cabe destacar que se necesitará un entendimiento previo del tema debido a que el texto intenta ser una explicación práctica de la manipulación de las tecnologías circundantes al tema.

Por ende no pretendo dar una descripción en detalle de los lenguajes mencionados anteriormente, pero si a fines prácticos mencionar que cada uno de estos formalismos está codificado en XML, si bien, el estándar no solo propone la codificación en XML (para un procesamiento adecuado por las máquinas), sino que también provee una sintaxis abstracta la que pudiera ser llevada a otros lenguajes.

La aparición de estos lenguajes provocó el desarrollo de un conjunto de frameworks, APIs, la mayoría escritas en Java que nos permiten manipular las ontologías casi en su totalidad y también razonar en base a ellas. Así fue como aperecion Jena, Pellet (Razonador OWL-DL), OWL API, etc. És aquí donde haremos incapié, es decir, en como utilizar todas éstas herramientas para nuestro beneficio.

En esta primera entrega vamos a hablar de Jena y como dar los primeros pasos acerca de la manipulación de las ontologías y en la segunda parte abordaremos lo relacionado al razonamiento.

Jena es un framework que nos provee de un entorno de desarrollo para RDF, RDFS, OWL y SPARQL, como también nos provee de la capacidad de contar con un motor de inferencia basado en reglas. Por todo lo dicho anteriormente Jena cuenta con el siguiente conjunto de APIs que enumeramos a continuación:
  • APIs de RDF
  • API de OWL
  • API ARQ para manejo de SPARQL (lenguaje utilizado para realizar consultas a la ontología)
  • Soporte de persistencia

Comenzaremos viendo como utilizar el API de OWL. Vamos a suponer que los lectores están familiarizados con la terminología de RDF y que poseen conocimientos en Java.
Como bien se describía anteriormente, existen distintos lenguajes RDF, RDF Schema, OWL, etc. En el orden en que fueron mencionados es en el orden en el cual van aumentando su poder de expresividad semántica. A su vez OWL tiene tres variantes las cuales son OWL-Lite, OWL-DL y OWL-Full, lo mismo para ellos, donde OWL-Full es más rico en expresividad que OWL-DL y éste mas que OWL-Lite.

El API de OWL de Jena utiliza un lenguaje neutral, es decir, los nombres de las clases no hacen mención al lenguaje subyacente que están representando (OWL, RDF, etc). Por ejemplo, la clase OntClass puede hacer referencia a una Clase OWL, o de RDF Schema, etc. Para representar las diferencias entre los distintos lenguajes, cada uno posee un profile que lista todos los contructores permitidos como los nombres de las clases y propiedades. Éste profile está unido al Ontology Model (OntModel) que es una versión extendida de la clase Model de Jena. La clase Model permite acceso a las sentencias en formato de recursos RDF. La clase OntModel extiende Model, agregando soporte para las sentencias que conforman OWL, como clases y jerarquías de clases, propiedades y jerarquías de propiedades e individuos. Cabe destacar que toda la información del modelo subyacente sea con OntModel como con Model esta almacenada en forma de tripletas RDF. Por ejemplo, supongamos que tenemos un objeto OntClass representando una determinada clase de nuestra ontología. Ésta clase tiene un método para determinar sus superclases, listSuperClasses() que se corresponde al valor de la propiedad rdf:SubClassOf de RDF. Cuando llamemos al método, Jena, obtendrá la información desde el modelo subyacente (Tripletas RDF), con lo que quiero dejar en claro que el objeto OntClass no guarda ninguna información de éstas características.

Continuando con los conceptos básicos acerca de como maneja Jena los recursos, presentaremos como el framework trabaja la manera del polimorfismo en Java. Supongamos que tenemos la siguiente afirmación de declaración de un recurso.
Código
GeSHi (xml):
<owl:Class rdf:ID="Persona">
</owl:Class>
 
Created by GeSHI 1.0.7.18

Ésto representa un recurso que declara con la URI relativa #Persona una Clase OWL. Entonces podríamos decir que la manera más obvia de declarar esto en Java sería instanciando la clase OntClass. Ahora supongamos que agregamos la siguiente información en forma de tripleta RDF al modelo, agregando más información a la declaración anterior.
Código
GeSHi (xml):
<owl:Class rdf:ID="Persona">
<rdf:type owl:Restriction />
</owl:Class>
 
Created by GeSHI 1.0.7.18

Esto significa que Persona es una OLW:Restriction. Una owl:Restriction es una subclase de owl:Class. El problema que tenemos en Java es que no podemos de manera dinámica cambiar la clase del objeto que representa el recurso. El recurso no cambio, porque sigue teniendo la URI #Persona, pero se puede optar por el modelo que ha cambiado de Class a Restriction. Por el contrario, si yo subsecuentemente elimino del modelo la rdf:type owl:Restriction ésta no sería más adecuada.

Otro ejemplo, en OWL – Full toda clase puede ser una owl:ObjectProperty, ésto indica que no podemos hacer un mapeo único entre los recursos RDF y las clases de Java, porque un objeto sería OntClass y ObjectProperty a la vez.

Jena resuelve el tema de los distintos niveles polimórficos de RDF y la abstracción de clases en Java (OntClass, Restriction, DataTypeProperty, ObjectProperty, etc) considerando a estas abstracciones como una vista del Recurso. Es decir, existe una relación uno a muchos, un recurso puede ser representado por varias vistas. Por ejemplo si el recurso es una clase owl (owl:Class), éste puede ser representado por la vista OntClass, Jena provee de un método as() que permite mapear desde RDF a una vista permitida.

En Java podríamos tener el siguiente código:
Código
GeSHi (java):
Resource r = myModel.getResource( myNS + "Persona" );
OntClass cls = (OntClass) r.as( OntClass.class );
 
Created by GeSHI 1.0.7.18

En el código anterior, podemos observar que existe un modelo representado por myModel, en la Parte 2 del tutorial explicaremos como instanciar modelos y cargar ontologías, por ahora nos valemos que el modelo ya está creado. La variable myNS, es el namespace del recurso. Con el método getResource() obtenemos el recurso en cuestión y aplicando el método as() mapeamos el recurso a OntClass. Si el recurso fuera también una ObjectProperty podríamos hacer lo mismo. y mapearlo a la clase corespondiente.

Como mencionamos anteriormente en la Parte 2 del tutorial veremos como Jena instancia los modelos, y también como se manejan los import de las ontologías y como se realiza la inferencia, estos conceptos, como los de persistir los modelos en Bases de Datos serán tratados en las próximas entregas.

Espero que hallan obtenido la información necesaria y que sea de interés y agrado la lectura de este tutorial. Para mi fue un gusto redactarlo.

Saludos y hasta la entrega de la segunda parte.

Comentarios

Entradas más populares de este blog

GWT Jsinterop

Construyendo Apliciones Web Modernas con Yeoman y Angular

¿Qué es GWT?