Como ya mencioné el tutorial
A Practical Guide To Building OWL Ontologies Using The
Protègè-OWL Plugin and CO-ODE Tools está realmente bien.
Sólo con leer esto, ya nos enteramos bastante de que va el cotarro. Pero como ya he indicado en post previos, para hacerte una idea de que se cuente es conveniente leer algo mas.
Tras introducirte el tema de las ontologías, y los tipos de OWL, pasa a crear una ontología sencilla sobre pizzas, usando claro está Protégé.
El texto se basa en una versión del programa más antigua, con lo que la descripción no es fiel a las versiones actuales, pero se sigue sin problemas. Yo he usado Protégé 3.4.
Sobre el interfaz de protégé... Me ha gustado. Es bastante intuitivo.
Veremos que hay 5 tabs, de los que nos interesarán 4:
- Metadata: Donde se gestionan los metadatos de la ontología, las importaciones, ...
- OWLClassses: donde trabajamos con las clases.
- Properties: donde se definen las propiedades
- Individuals: donde se definen los individuos
En cuanto a los menus...
Son muy evidentes. En Reasoning, tendremos las opciones para chequear la consistencia de la ontología y para clasificarla. Mediante la segunda opción es como podemos generar una
ontología inferida (se generan nuevas relaciones y nodos, mediante inferencia)
En cuanto a las preferencias...
Tenemos varias:
- Edit -> Preferences...: General y Property Files (protege.properties y Protege.lax). En el último fichero podemos controlar la memoria usada por protégé. Estas son propiedades generales de Protegé.
- Project -> Configure...: Específicas del proyecto.
- OWL -> Preferences...: Ya específicas del OWL. Por ejemplo los tests a ejecutar se configuran aquí.
Para ayuda a la creación, protégé proporiona wizards. Los podemos encontrar en el menú Tools, tanto en Patterns, como en Quick OWL.
En el tutorial se usan (al menos):
- Tools -> Patterns -> Value Partition...
- Tolos -> Quick OWL -> Create multiple subclasses...
- Tolos -> Quick OWL -> Create multiple properties...
Sobre los ficheros usados por protégé... Si se usa el almacenamiento en fichero, la ontología se guardará en un fichero
.owl. En dicho fichero estarán las uris de las ontologías que usen la que estamos definiendo. Si esos recursos no estan accesible, por ejemplo porque los tengamos en archivos locales en el sistema de archivos, Protégé es capaz de cargarlos. Para ello usa un fichero con la extensión
.repository. El tercer archivo que usa es el
.pprj, en el que se almacena toda la información ya específica del nuestro proyecto con Protégé.
Si importamos una ontología y esta a su vez depende de otra que no está accesible, bien porque no dispongamos de ella, no se pueda acceder online, o la ruta en el .repository esté mal, Protégé nos dará un error al cargarla.
Y tras este preámbulo vayamos a lo que nos cuenta el tutorial...Como ya he indicado a lo largo del tutorial, mediante OWL-DL (DL viene de
Lógica Descriptiva) se crea una
jerarquia de clases,
propiedades (
funcionales,
inversas,
transitivas y
simétricas). Una jerarquía de clases es una
taxonomía.
Las propiedades tienen
dominio y
rango.
Las propiedades pueden ser tres tipos:
Object,
Annotation,
Datatype.
Posterioremente se pasa a crear
restricciones.
Una cosa importante sobre las clases, y es que por defecto no son '
disjoints'.
Y otra importante, es que OWL no usa
UNA (Unique Name Assumption). Es decir que dos nombres diferentes pueden referirse al mismo individuo.
En DL las clases son
conceptos y las propiedades
roles (vamos... relaciones).
Tenemos los siguientes tipos de
Property Restrictions:
- Quantifier Restrictions (existencial quantifier y universal quantifier). Las restricciones mas comunes son las existenciales.
- Cardinality Restrictions
- hasValue Restrictions
Una restricción, de hecho, describe lo que es una
'anonymous class' (o '
unnamed class').
Las existenciales también se las conoce como
'some' o
'at least one'.
Las universales también se las conoce como
'only' o
'all'.
Lo siguiente que pasa es a probar el
Razonamiento. Con Protégé 3.4 y escogiendo como razonador
Pellet, no hace falta instalar nada adicional. Esto nos servirá para detectar inconsistencias en la ontología. Intenté usar
DIG, pero no me funcionó (usando
RacerPro).
Posteriormente se muestra la diferencia entre las condiciones 'necesarias' y las 'necesarias y suficientes', lo que da lugar a
clases primitivas y
definidas (El icono tiene tres lineas).Una clase primitiva sólo tiene condiciones necesarias.
Es posible tener mas de un bloque de condiciones 'necesarias y suficientes'.
Llegados a este punto es importante tener en cuenta dos cosas:
- Podemos pensar que con crear una restricción universal vale, ¡¡¡pues no!!!. Si creamos una restricción universal normalmente deberemos crear la correspondiente existencial, ya que la universal no garantiza la existencia. Lo que indica es que si la relación existe para una determinada propiedad, lo será con los miembros de una determinada clase.
- Y por otro lado, OWL trabaja con Open World Assumption (en contraposición con Close World Assumption).
Mediante razonamiento, se pueden crear nuevas relaciones de tipo superclass-subclass.
Posteriormente muestra como crear
Closure Axioms,
Value Partitions (es un 'patrón de diseño) y
Covering Axioms.
Y va acabando con
hasValue Restrictions,
Enumerated Classes,
Annotation Properties,
namespaces,
imports,
tests,
todo lists.
Al final tiene un par de apendices:
- A: donde repasa todos los tipos de restricciones: quantifier (someValuesFrom, allValuesFrom), hasValue, cardinality, minCardinality, maxCardinality.
- B: Intersection Classes, Union Classes.
Unos apuntes aleatorios:
- todas las clases son descendientes de owl:Thing
- como se ha indicando antes, por defecto las clases se superponen (overlap). Es decir, cuando creamos dos hermanas, no se asume que sus miembros pertenecen a una u a otra. Si es lo que queremos hay que indicarlo explicitamente.
- Se puede introducir metadatos a varios elementos. Para ello se dispone de Dublin Core ontology.
- Lo que en el tutorial llama 'Properties Matrix Wizards', en el menú actual es 'Create multiple properties...'.