RDF y RDF schema

Sobre el documento

En este documento dará una introducción general a lo que es RDF (para lo cual usaré muchos ejemplos) y sus propósitos generales. Después daré a conocer RDF schema, que es una extensión de RDF.

Índice

  1. ¿Cuál es nuestro objetivo?
  2. RDF
  3. RDF schema (RDFS)
  4. Evitar recursos anónimos
  5. Conclusiones
  6. Referencias

1 ¿Cuál es nuestro objetivo?

Recordemos que lo que queremos es hacer que la información no sea un obstáculo mismo para su utilización en la web, i.e. queremos que sea comprensible, para la computadora, los datos que se presentan en una página. Para esto es necesario una gran cantidad de herramientas para la manipulación de los datos, el proceso automático del contenido, herramientas de inferencia lógica, métodos de integración entre distintas fuentes de información, técnicas de seguridad, etcétera.

Sin embargo hay que aprender a caminar antes de comenzar a correr, por lo que si pensamos qué es lo que necesitaríamos inicialmente para poder llevar a cabo tan grande empresa, nos daríamos cuenta rápidamente que para que una computadora entienda ciertos datos, tenemos que ponernos de acuerdo sobre la forma en que vamos a distinguirlos, i.e. a nombrarlos y representarlos. Y eso mismo es nuestro objetivo, aprender a nombrar cosas, pero de tal forma que esté bien definida y se convierta en un tipo de vocabulario común.

Lo que resta para conocer parte del desarrollo del web semántico es lo que se verá en las siguientes exposiciones.

2 RDF

2.1 ¿Qué es RDF?

Pues RDF fue creado en 1998 y recomendado por W3C en 1999. Es acrónimo de Resource Description Framework y es un lenguaje para la representación de la información sobre los recursos en la web (autor de una página web, licencia, etc.), particularmente dirigido para la representación de los metadatos. Es decir, define la sintáxis y modelos de datos para la representación semántica de los datos.

RDF se basa en los estándares de URIs y Unicode además de que se puede presentar en XML (por lo que se le considera como una de sus aplicaciones).

Antes de continuar hay que observar que para nuestros propósitos no sólo necesitamos una representación de la información, sino tambien tener la posibilidad de poder hablar de información a cerca de la información. Por ejemplo, cuando hacemos una demostración formal y rigurosa en alguna clase, tomamos nota en nuestro cuaderno de la demostración. Pero para escribir que hemos terminado y que la afirmación resultó verdadera o falsa no tenemos forma de ponerlo en nuestro lenguaje formal, i.e. no escribimos "estoy demostrado" con elementos de nuestro lenguaje, sino que usamos el español (un metalenguaje) para decir que la demostración está hecha.

(Propiedades de RDF). Así que RDF nos permitirá escribir "metainformación" para cualquier tipo de datos y trabajar con ellos. Podremos describir las propiedades de los documentos y de cualquier recurso. Además nos permitirá la interoperabilidad entre distintas aplicaciones sin pérdida del significado de los datos.

En pocas palabras, RDF nos da la forma de la representación de información a cerca de los recursos que pueden ser identificadas en la web.

2.2 Construcción de enunciados

Como ya vimos RDF proporciona un modelo de datos para dar información a cerca de los recursos. Éste modelo nos obliga a describir los recursos en términos de propiedades y valores lo que nos forza a crear enunciados simples sobre los recursos los cuales constan de tres elementos: objeto, propiedad y valor de la propiedad (que es aplicada al objeto). Para tener una idea más clara de lo que estamos haciendo necesitaremos recurrir a nuestras clases básicas de Español :( y a algún ejemplo.

Supongamos que queremos decir algo sobre algún recurso como: "La página http://www.ejemplo.org ha sido creada por Fulanito". Así que distinguiremos las tres partes que nos interesan de ese enunciado:

  1. El sujeto de lo que estamos hablando: en este caso es la página
  2. La propiedad de la que estamos hablando del sujeto: la página fue creada
  3. El valor u objeto de la propiedad: la página fue creada por Fulanito

Ejemplo 2. Del enunciado "La manzana es de color roja" los tres elementos que distinguimos son:

  1. El sujeto es: manzana
  2. La propiedad es: color
  3. El valor es: morada

Otro ejemplo. Supongamos que nuestro universo es el conjunto de los naturales y que nuestro lenguaje está dentro del cálculo de predicados. Usamos la constante c para simbolizar a el cero como nuestro elemento distinguido y la letra predicativa P para referirnos a la propiedad de ser par. Así que si escribimos el enunciado "P(c)" tenemos que nuestro enunciado lo entenderíamos como:

  1. El sujeto (de lo que hablamos) es: la constante 0
  2. La propiedad (del objeto) es: ser par
  3. El valor (que verifica la propiedad) es: "verdadero" (o falso para los impares)

Por lo que para identificar el sujeto vemos de quién estamos hablando, la propiedad la reconocemos al tratar de preguntarnos "¿qué queremos saber del sujeto?" y el valor lo obtenemos al aplicar la propiedad al sujeto(¿quién creó la página?)

Sin embargo no todo se puede expresar en un sólo enunciado, por lo que se requiere que se describa cada una de las propiedades del objeto en términos de otros enunciados. Por ejemplo escribir:

"Fulanito tiene la dirección Callejon del Sapo no.13 C.P 001, Nayarit"

requiere especificar por separado cada uno de los componentes de la dirección (si queremos decir la dirección de otra forma a la que está escrita). Entonces lo que tendría que escribir varios enunciados como:

  • Fulanito tiene la dirección X
  • X se refiere a la calle Callejón del Sapo no.13
  • X tiene el código postal 001
  • X se refiere al estado de Nayarit
  • Identificando algunos de los componentes tenemos que:

    1. Fulanito tiene la dirección X
    2. sujeto: Fulanito
    3. propiedad: dirección
    4. valor: X
    1. X se refiere a la calle Callejón del Sapo no.13
    2. sujeto: X
    3. propiedad: calle
    4. valor:Callejón del Sapo no.13

    Y de esta manera tenemos varios enunciados de la forma que requerimos. La X es sólo una etiqueta que nosostros decidimos poner para hacer la descripción como se debe. También tiene una representación especial pero no se desesperen pronto la veremos...

    2.3 Creación de URIs

    RDF está basado en la idea identificar cosas usando URIs (que son cadenas que identifican algún recurso -como imágenes, documentos, archivos, etcétera- para hacerlo disponible bajo una gran cantidad de esquemas como HTTP o FTP). La especificación de los URIs se encuentra en el [RFC2396 ]. Ninguna persona u organización controla la construcción de los URIs o cómo deben ser usados. Esto significa que no se necesita un permiso especial para crear un URI de algo, por lo que podemos también crear URIs para cosas que no nos pertenecen(hacer referencia a otros URIs).

    RDF usa lo que llamaremos URIref (URI references) para nombrar al sujeto, a la propiedad o al valor de algún enunciado RDF. Un URIref es un URI junto con un identificador al final. Por ejemplo, el URIref http://www.ejemplo.org/index.html#seccion2 consiste de el URI http://www.ejemplo.org/index.html y (separado por el caracter #), el identificador seccion2.

    Recordemos entonces que un URIref nos sirve para identificar un recurso y lo que finalmente haremos es identificar cada elemento de un enunciado (a excepción tal vez del valor) con algún URIref que nosotros crearemos o que esté ya definido en alguna otra parte. Un ejemplo de cómo se define "creator" es en The Dublin Core Element Set.

    La definición dada por un URIref es única porque está conformada por un prefijo que consta del URL de donde se encuentra la definición, que es más que suficiente para establecer su unicidad.

    Algunos ejemplos de URIref's son los siguientes:

    1. http://purl.org/dc/elements/1.1/creator
    2. http://www.example.org/terms/languaje
    3. http://www.example.org/terms/creation-date
    4. http://www.example.org/staffid/12345

    Los cuales se refieren a los siguientes significados:

    1. Es la propiedad de "crea"
    2. Es la propiedad de "idioma" definida en algún lugar del dominio
    3. Es la propiedad de "fecha de creación"
    4. Es el identificador de algún sujeto con número 12345

    Los valores de los enunciados se representan tal y cual como están :) pero sólo alguna veces (cuando el valor no es un recurso).

    Hasta éste punto hemos hablado de recursos y hemos entendido que un documento, una imágen, etcétera, son recursos. Sin embargo, ahora nuestra definición se expande y entenderemos por recurso todo aquello que pueda ser identificado por un URIref. Por lo que la información de la información puede ser considerada como un recurso puesto que puede tener un URIref. !qué loco!, ¿no?.

    2.4 Representaciones de enunciados

    Ya que sabemos cómo escribir y poner un URI a cada parte del enunciado, hay que familiarizarnos ahora con las distintas representaciones que tenemos para un enunciado. Primero veremos la representación de gráficas y luego la de ternas :)

    De hecho, es casi directa la representación con los enunciados a gráficas pues sólo hay que representarlo de la manera en como se ve en la figura 1.

    FIG 1. Representación con gráficas de enunciados.

    Hay que observar que la flecha apunta hacia el valor (object). Así que si queremos decir que "La página http://www.example.org/index.html fue creada por Fulanito De Tal y creada el día 30 de febrero", nos queda el siguiente diagrama de la figura 2.

    FIG 2. Ejemplo de representación de enunciados con gráficas.

    Fulanito De Tal resulta ser un recurso porque podemos decir más cosas sobre él (como la dirección de Fulanito, lo cual vendría siendo información de la información que estamos dando sobre la página).

    Hay que notar que lo que identificamos como recursos lo encerramos dentro de una elipse y lo que no es un recurso se encierra dentro de un rectángulo.

    Ahora para especificar cómo va el diagrama del ejemplo que pusimos para describir la dirección de Fulanito("Fulanito tiene la dirección Callejon del Sapo no.13 C.P 001, Nayarit") sólo tenemos que representar a nuestra X como un nodo en blanco:

    FIG 3. Nodos blancos en la representación con gráficas.

    Fácil ¿no?. Ahora sólo nos falta por ver la otra forma de representación de tripletas que es más sencilla aún, sólo tenemos que escribir los tres componentes del enunciado en una línea de forma ordenada (sujeto, predicado, valor)con sus URIref's respectivos. Por ejemplo escribir "La página http://www.example.org fue creada por Fulanito" se escribe así (si usamos los mismos URIref's que en las gráficas):

    En donde observamos que el URIref de la página es su mismo identificador, el URIref de la propiedad es descrito por http://purl.org/dc/elements/1.1/creator y que Fulanito tiene su propio identificador http://www.example.org/ids/fulanitoID

    Como vemos no es muy difícil la representación, pero para cada enunciado tenemos que escribir varias veces lo mismo, pues para decir que la misma página tiene fecha de creación 30 de febrero tenemos que escribir:

    Por lo que usamos lo que se llama Qnames y que sólo son abreviaturas para los URIref's y además omitimos "<" y ">" . Los escirbimos como lo vemos en el siguiente ejemplo:

    Observamos que el Qname sólo es una etiqueta (en éste caso estamos definiendo ex_foo1 y rdf_foo2) que nos permitirá reducir la escritura tan repetitiva del uso de ternas. Por lo que si queremos utilizar ex_foo1 o rdf_foo2 hacemos lo siguiente:

    que son la abreviatura de:

    respectivamente. Por lo que ahora nuestros enunciados quedarían así:

    Ahora díganme ustedes ¿qué creen que digan esos enunciados? ¿no es más fácil escribirlos de ésta manera? Y con esto ya tenemos casi lo que necesitamos para escribir las cosas en XML, sólo nos falta explicar cómo se representa el nodo blanco en tripletas.

    De la misma manera en que agregamos el identificador X en el ejemplo de la dirección, aquí sólo tenemos que agregar un identificador para establecer que es sólo un URIref intermediario para representar otros conceptos. Los nodos blancos son llamados "recursos anónimos" y se representan añadiendo el prefijo "_:" (el identificador de los nodos blancos) a algún otro identificador que nosotros inventemos. Por ejemplo:

    2.5 RDF/XML

    RDF provee de una sintáxis sobre XML para escribir la representación de gráficas o tripletas y a ésto se le conoce como RDF/XML. Su sintáxis está definida en RDF/XML Syntax Specification.

    Para entender cómo se escribe en XML veamos un ejemplo, usemos nuestro bien conocido enunciado "La página http://www.example.org/index.html fue creada el 30 de febrero". Así que su diagrama sería el siguiente:

    FIG 4. Ejemplo "Fecha de creación de una página con la representació de gráficas"

    y su representación en tripleta es:

    con "ex" como la abreviación de "http://www.example.org", exterms como la abreviación de "http://www.example.org/terms/". Así que su escritura en XML resulta ser:

    	1. <?xml version="1.0"?>
    2. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    3. xmlns:exterms="http://www.example.org/terms/">
    4. <rdf:Description rdf:about="http://www.example.org/index.html">
    5. <exterms:creation-date>30 de febrero</exterms:creation-date>
    6. </rdf:Description>
    7. </rdf:RDF>

    En la línea 1 tenemos las características del documento. En la línea 2 y 3 se establecen los identificadores de cada espacio de nombres, lo que correpondería con lo que nosotros llamamos Qnames (las abreviaciones). La línea 4 indica que estamos describiendo un recurso y la forma en que identificamos de lo que estamos hablando es usando el atributo "rdf:about", i.e. en ésta línea se describe al sujeto del que vamos a hablar (en éste caso es la página). Es hasta la línea 5 que se escribe la propiedad (con <exterms:creation-date>) y el valor de la propiedad (30 de febrero). Las líneas 6 y 7 sólo cierran los correspondientes elementos.

    Ahora va un ejemplo más grande pero con la particularidad de que también muestra cómo se representan los nodos blancos. 

    Supongamos que queremos escribir "El documento http://www.example.org/index.html tiene como título "Welcome" y el editor es Fulanito De Tal cuya página personal es http://www.yahoo.com/fulanito.html". Por lo que tenemos el siguiente diagrama:

    FIG 5. Representación gráfica del ejemplo: "El documento http://www.example.org/index.html tiene como título "Welcome" y el editor es Fulanito De Tal cuya página personal es http://www.yahoo.com/fulanito.html"

    El nodo blanco sólo se identifica dentro del documento usando el atributo "rdf:nodeID" tanto en la referencia como sujeto (en vez de usar rdf:about), como en la descripción como valor (pues hay que fijarse que cuando el valor de una propiedad es un recurso, se escribe usando quot;rdf:resource").

    	1.  <?xml version="1.0"?>
    2. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    3. xmlns:dc="http://purl.org/dc/elements/1.1/"
    4. xmlns:exterms="http://www.example.org/terms/">

    5. <rdf:Description rdf:about="http://www.example.org/index.html">
    6. <dc:title>Welcome</dc:title>
    7. <exterms:editor rdf:nodeID="abc"/>
    8. </rdf:Description>

    9. <rdf:Description rdf:nodeID="abc">
    10. <exterms:fullName>Fulanito De Tal</exterms:fullName>
    11. <exterms:homePage rdf:resource="http://www.yahoo.com/fulanito.html"/>
    12. </rdf:Description>

    13. </rdf:RDF>

    Las líneas que nos interesan son de la 5 a la 12. En la línea 5 tenemos el recurso que queremos describir, el documento. En las líneas 6 se describe la propiedad "título" con valor "Welcome".  La línea 7 muestra que para tener información del editor tenemos que tomar como valor un nodo blanco, el cual tiene como identificador la cadena "abc". La cadena "abc" se puede ver como el sujeto de un enunciado (el cual se refiere al editor del documento) con la propiedad de que tiene un nombre completo "Fulanito De Tal" (que se describe en el renglón 10) y la propiedad de tener una página personal  con valor &quothttp://www.yahoo.com/fulanito.html" (observemos que como es un recurso, se utiliza "rdf:resource". 

    2.6 Chuncherías

    A veces es necesario describir grupos de cosas, por ejemplo, decir que algo fue creado por varios autores, o decir la lista de estudiantes del semianio de inteligencia artificial. RDF provee de tipos pre-definidos (conocidos como contenedores) que pueden ser usados para describir tales grupos. 

    Las cosas agrupadas se conocen como elementos. Los miembros  de los contenedores pueden ser recursos  o literales. RDF define tres tipos de contenedores:

    El recurso con tipo rdf:bag (bag) es un grupo de miembros, posiblemente duplicados, donde no hay importancia con el orden de ellos.

    El recurso con tipo rdf:seq (sequence) es un grupo de miembros, posiblemente duplicados, donde el es relevante su orden.

    El recurso con tipo rdf:Alt (alternative) es un grupo de miembros  de los que son alternativos.

    La deficiencia con estos tipos definidos en RDF es que no sabes cuantos miembros tienes en cada contenedor ya que de algún otro lugar se pueden agregar más elementos. Por esto se define lo que se llaman colecciones, que son un grupo de cosas representadas por una estructura de lista.

    Para más información consultar en RDF-Primer Other Capabilities.

    3 RDF schema (RDFS)

    3.1 ¿Qué es RDF schema?

    RDF provee una forma para expresar enunciados simples a cerca de los recursos usando propiedades y valores. Sin embargo, la comunidad de usuarios de RDF se percató que se necesitaba indicar algunas veces que lo que estaban describiendo eran tipos o clases específicas de recursos. RDF por si sólo no proporciona tal vocabulario, por lo que las clases y propiedades se describen en RDF Vocabulary (también conocido como RDF schema. Su definición se encuentra en RDFS).

    RDF schema no proporciona un vocabulario sobre aplicaciones orientadas a clases, sino que provee de mecanismos para especificar que tales clases y propiedades son parte de un vocabulario y de cómo se espera su relación. También permite definir a los recursos como instancias de una o más clases. Además permite que las clases puedan ser organizadas en forma jerárquica.

    Por lo tanto, RDF schema extiende a RDF para incluir un amplio vocabulario con un significado adicional.

    3.2 Clases

    Las clases definidas por RDFS pueden representar casi cualquier categoría de cosas, como páginas web, gente, tipos de documentos, conceptos abstractos, etc. Las clases son descritas por recursos rdfs:Class y rdf:Resource, y por propiedades como rdf:type y rdfs:subClassOf.

    Los recursos que pertenecen a una clase son llamados instancias.

    Así que en RDF schema, una clase es cualquier recurso que tenga un tipo (rdf:type) como propiedad cuyo valor sea un recurso rdfs:Class.

    Entenderemos por la etiqueta "rdf:type" que todo recurso que la ocupe deberá tener las características que distinguen al recurso que se encuentre del lado derecho de la etiqueta.

    Veamos un ejemplo. Supongamos que queremos describir la clase Veículo Motorizado con URIref como ex:MotorVehicle (usamos ex como http://www.example.org/schemas/vehicles), así que la terna:

    ex:MotorVehicle rdf:type rdfs:Class

    representa tal clase. La propiedad rdf:type indica que tal recurso es una instancia de una clase. Si queremos describir que el recurso ex:companyCar es un vehículo motorizado, debemos escribir la siguiente terna:

    ex:companyCar rdf:type ex:MotorVehicle

    Es decir, la terna anterior es un ejemplo de una instancia de la clase MotorVehicle (traducción cercana al español: vehículo motorizado).

    Podemos describir clases adicionales representando varios tipos adicionales de vehículo motorizado. Éstas clases las podemos representar de la misma forma descrita antes:

    y para indicar su relación con la clase MotorVehicle usamos:

    con ésto establecemos que Van y Truck son subclases (con rdfs:subClassOf) de MotorVehicle, i.e. representa un conjunto o subconjunto de dos clases.

    Otro ejemplo más amplio lo obtenemos de la figura 6.

    FIG 6. Ejemplo de clases y subclases de vehículos motorizados.

    Lo que estamos modelando en la figura 6 es que un vehículo van, un vehículo truck y un vehículo de pasajeros son vehículos motorizados. Además de que un mini van es un van y por lo tanto es un vehículo motorizado. <\p>

    Y su descripción en tripletas es la siguiente:

    	ex:MotorVehicle rdf:type rdfs:Class .
    ex:PassengerVehicle rdf:type rdfs:Class .
    ex:Van rdf:type rdfs:Class .
    ex:Truck rdf:type rdfs:Class .
    ex:MiniVan rdf:type rdfs:Class .

    ex:PassengerVehicle rdfs:subClassOf ex:MotorVehicle .
    ex:Van rdfs:subClassOf ex:MotorVehicle .
    ex:Truck rdfs:subClassOf ex:MotorVehicle .

    ex:MiniVan rdfs:subClassOf ex:Van .
    ex:MiniVan rdfs:subClassOf ex:PassengerVehicle .

    Así que en XML tenemos:

    	<?xml version="1.0"?> 
    <rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">

    <rdf:Description rdf:ID="MotorVehicle">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

    <rdf:Description rdf:ID="PassengerVehicle">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    </rdf:Description>

    <rdf:Description rdf:ID="Truck">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    </rdf:Description>

    <rdf:Description rdf:ID="Van">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    </rdf:Description>

    <rdf:Description rdf:ID="MiniVan">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    <rdfs:subClassOf rdf:resource="#Van"/>
    <rdfs:subClassOf rdf:resource="#PassengerVehicle"/>
    </rdf:Description>

    </rdf:RDF>
     

    Observamos que no sólo tenemos etiquetas "rdf:about" sino que también tenemos etiquetas del tipo "rdf:ID" que son las que nos permiten poner el nombre al recurso que estamos describiendo. Además hay que hacer notar que para referirnos a un recurso que acabamos de describir se pone el símbolo gato (#) antes del nombre del identificador respectivo al recurso.

    3.3 Propiedades

    Además de escribir clases de cosas, tambien queremos escribir propiedades específicas .En RDFS las propiedades se describen usando la clase rdfs:Property con las propiedades definidas rdfs:domain, rdfs:range y rdfs:subPropertyOf.

    Pues antes de avanzar, todo lo que estamos describiendo puede recordar al paradigma orientado a objetos, sólo que esta ocasión sólo lo recuerda ya que no es igual debido, principalmente, a que las propiedades son CLASES y que pueden ser INDEPENDIENTES de la clase con la que se le relacione.

    Todas las propiedades en RDF se describen como instancias de la clase rdfs:Property. Recordemos que se le debe asignar a la propidad que queremos describir un URIref. Así entonces tenemos que para decir que algo es una propiedad tenemos que escribir en nuestro enunciado que algo es el sujeto, y es de tipo (ésta palabra funciona como propiedad) propiedad (el valor de la propiedad del sujeto).

    Pero también necesitaremos describir cómo las propiedades se relacionan con los datos y para eso usamos las propiedades de la clase Property llamadas rdfs:range y rdfs:domain.

    rdfs:range indica que los valores de la propiedad son instancias de alguna clase o algún otro tipo de dato. Ejemplo:

    Ésto indica que "Person" es una clase, "author" es una propiedad y que el valor de "author" debe ser una instancia de "Person".También podemos indicar que la propiedad es un tipo de dato:

    Que no se nos olvide que sólo estamos dando más información sobre los recursos que tenemos, por lo que el ejemplo anterior no nos asegura que una instancia sea realmente un entero, sino que debería tener lo que entendemos en xsd como entero como valor. También notemos que estamos usando la definición de enteros que tiene xsd (XML schema).

    Ahora, ésto no dice que "integer" sea un tipo de datos, por lo que para dar esa información se debe de darla explícitamente:

    En caso de que no especifiquemos el rango de la propiedad P, no nos dá ni nos quita información sobre la propiedad. Si definimos UN rango en la propiedad, ésto sólo dice que los valores de P son solamente instancias del rango dicho. En caso de que P tenga más rangos, tenemos que P tiene recursos que son instancias de TODAS las clases especificadas en los rangos (UPS! ésto puede meter conflictos si las clases que son rango de la misma propiedad tuvieran significados muy distintos).

    La propiedad rdfs:domain es usada para indicar que una propiedad es aplicada a la clase designada. Por ejemplo:

    Y lo que nos dicen esos enunciados es que "Book" es una clase, "author" es una propiedad y que un enunciado que use la propiedad "author" es porque el sujeto es una instancia de "Book".

    Así como en el caso de los rangos, una propiedad P puede definirse para varios dominios, i.e. clases distintas pueden tener la misma propiedad. En caso de que P no esté definida en algún dominio entonces no estamos diciendo nada sobre los recursos (ni que tengan P ni que no la tengan). Si la propiedad está definida en un solo dominio, se entenderá que esa propiedad se aplica sólo a las instancias de esa clase en particular (se aplica sólo en ese dominio). En caso de que tuviera más de dos dominios (que se defina la propiedad en más de dos clases), dice que cualquier recurso que tenga esa propiedad es instancia de TODAS las clases especificadas por sus dominios.

    Un ejemplo del uso de éstas propiedades es lo siguiente:

            <rdf:Description rdf:ID="registeredTo">
    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>

    <rdfs:domain rdf:resource="#MotorVehicle"/>
    <rdfs:range rdf:resource="#Person"/>
    </rdf:Description>

    <rdf:Description rdf:ID="rearSeatLegRoom">
    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>

    <rdfs:domain rdf:resource="#PassengerVehicle"/>
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/>

    </rdf:Description>

    <rdf:Description rdf:ID="Person">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:Description>

    <rdf:Description rdf:about="http://www.w3.org/2001/XMLSchema#integer">

    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Datatype"/>
    </rdf:Description>

    Así como en las clases podemos definir subconjuntos con características específicas (subclases), también en las propiedades (que son clases) podemos realizar un procedimiento parecido. Describimos la especialización entre dos propiedades usando rdfs:subPropertyOf. Por ejemplo ex:primaryDriver y ex:Driver ambas son propiedades, pero podemos notar que ex:primaryDriver es una especialización de ex:driver, así que si escribimos los enunciados tenemos:

    ¡Ajá! entonces como las propiedades son clases, también podemos tener subclases de éstas (a las que llamamos subpropiedades). Tal vez si lo pensamos un poco podemos pensar en las subpropiedades como "grados" de alguna propiedad. Como, por ejemplo, la propiedad de ser Conductor. Conductor tiene grados de ser el "Conductor Principal" o el "Conductor Designado", a final de cuentas todos son conductores, pero con diferente importancia cada uno. Otro ejemplo es si pensamos en la propiedad Color, podemos tener grados de color, ya sea "Color claro" o "Color obscuro", etc.

    El significado de ser sub-propiedad es que se agregan significado implícitos dentro de una propiedad. (se agregan los significados de la clase superior). Tenemos por lo tanto que se escribe lo anterior de la forma siguiente:

    1.  <rdf:Description rdf:ID="driver">
    2. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    3. <rdfs:domain rdf:resource="#MotorVehicle"/>
    4. </rdf:Description>

    5. <rdf:Description rdf:ID="primaryDriver">
    6. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    7. <rdfs:subPropertyOf rdf:resource="#driver"/>
    8. </rdf:Description>

    Pues todo lo que tenemos que hacer es seguir el modelo antes expuesto para escribir las ternas y pasarlas a XML, como ya lo habíamos visto y todo resulta ser más sencillo.

    Si juntamos todo lo anterior (desde el ejemplo de la sección anterior) tenemos el resultado siguiente:

    1.	<?xml version="1.0"?>
    2. <rdf:RDF
    3. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    4. xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    5. xml:base="http://example.org/schemas/vehicles">

    6. <rdf:Description rdf:ID="MotorVehicle">
    7. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    8. </rdf:Description>

    9. <rdf:Description rdf:ID="PassengerVehicle">
    10. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    11. <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    12. </rdf:Description>

    13. <rdf:Description rdf:ID="Truck">
    14. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    15. <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    16. </rdf:Description>

    17. <rdf:Description rdf:ID="Van">
    18. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    19. <rdfs:subClassOf rdf:resource="#MotorVehicle"/>
    20. </rdf:Description>


    21. <rdf:Description rdf:ID="MiniVan">
    22. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    23. <rdfs:subClassOf rdf:resource="#Van"/>
    24. <rdfs:subClassOf rdf:resource="#PassengerVehicle"/>
    25. </rdf:Description>

    26. <rdf:Description rdf:ID="Person">
    27. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
    28. </rdf:Description>



    29. <rdf:Description rdf:about="http://www.w3.org/2001/XMLSchema#integer">
    30. <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Datatype"/>
    31. </rdf:Description>

    32. <rdf:Description rdf:ID="registeredTo">
    33. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    34. <rdfs:domain rdf:resource="#MotorVehicle"/>
    35. <rdfs:range rdf:resource="#Person"/>
    36. </rdf:Description>

    37. <rdf:Description rdf:ID="rearSeatLegRoom">
    38. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    39. <rdfs:domain rdf:resource="#PassengerVehicle"/>
    40. <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/>
    41. </rdf:Description>

    42. <rdf:Description rdf:ID="driver">
    43. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    44. <rdfs:domain rdf:resource="#MotorVehicle"/>
    45. </rdf:Description>

    46. <rdf:Description rdf:ID="primaryDriver">
    47. <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
    48. <rdfs:subPropertyOf rdf:resource="#driver"/>
    49. </rdf:Description>

    50. </rdf:RDF>

    Entonces agregando en el diagrama todos los recursos que tenemos aquí nos queda algo como lo que tenemos a continuación en la figura 7.

    FIG 7. Extensión de clases del ejemplo de la figura 6.

    Un ejemplo de una instancia de ex:PassengerVehicle es:

    <?xml version="1.0"?>
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ex="http://example.org/schemas/vehicles">

    <ex:PassengerVehicle rdf:ID="johnSmithsCar">

    <ex:registeredTo rdf:resource="http://www.example.org/staffid/85740"/>
    <ex:rearSeatLegRoom rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">127</ex:rearSeatLegRoom>
    <ex:primaryDriver rdf:resource="http://www.example.org/staffid/85740"/>
    </ex:PassengerVehicle>
    </rdf:RDF>

    Que es una abreviación de lo que está a continuación:

    <?xml version="1.0"?>
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ex="http://example.org/schemas/vehicles">

    <rdf:Description rdf:ID="johnSmithsCar">
    <rdf:type rdf:resource=""http://example.org/schemas/vehicles#PassengerVehicle">

    <ex:registeredTo rdf:resource="http://www.example.org/staffid/85740"/>
    <ex:rearSeatLegRoom rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">127</ex:rearSeatLegRoom>
    <ex:primaryDriver rdf:resource="http://www.example.org/staffid/85740"/>
    </rdf:Description>
    </rdf:RDF>

    Pues para que no quede duda, "rearSeatLegRoom" lo podemos traducir como "espacio en el asiento trasero para las piernas" (¡eso creo!). Pues agregando en el diagrama anterior los recursos que describen el código mostrado tenemos que los valores de cada clase o propiedad serían los que están marcados en azul:

    FIG 8. Valores que toman las clases. Agregado de la figura 7.

    Sin embargo, no podemos hablar claramente de lo que el ejemplo describe en éste diagrama porque sólo estamos dando los valores que describen el recurso "johnStithsCar". Así que escirbiendo el diagrama del recurso que describimos notamos que queda como sigue:

    FIG 9. Descripción del recurso "El vehículo de John Smith está registrado a nombre de http://www.example.org/staffid/85740 y su conductor principal es http://www.example.org/staffid/85740. El vehículo tiene el valor de 127 unidades de espacio para las piernas en el asiento trasero"

    Hay que ver que no escribí el URI completo de "johnSmithsCar" y esto se debe a que depende de dónde esté implementada la descripción que estamos haciendo.

    OBSERVACIÓN IMPORTANTE: El diagrama no lo dibujé como debería de ser ya que no escribí el URI completo en las flechas de la gráfica.

    Como vemos, tenemos que el diagrama del último ejemplo que dibujamos es muy distinto a que si queremos agregar éstos valores a la gráfica que tiene todas las clases que describimos.

    4 Evitar recursos anónimos

    Para evitar escribir etiquetas con nodos en blanco, tenemos otra opción. Para esto recordemos el ejemplo del diagrama siguiente (fig 5):

    FIG 10. Ejemplo de recurso anónimo.

    Primero que nada tenemos que darnos cuenta que la gráfica se compone de series de nodos y aristas (como toda buena gráfica, o por lo menos las que esperamos). Así que tenemos series de nodo, arista, nodo, arista,...

    Para presentar la información dada por la gráfica, tenemos que tomar un camino desde un nodo hasta otro nodo. Tomemos el camino que va desde el nodo que tiene el URI de la página (en la figura 10), pasa por la arista que se dirige hacia el nodo blanco (que describe la propiedad del editor), el nodo blanco, la arista con la descripción de página personal, hasta llegar al nodo con el identificador de la página. Observemos que tenemos en nuestro camino: un recurso(página), propiedad(editor), recurso (del nodo blanco), propiedad(página personal) y finalmente otro recurso (la página).Para presentarlo en RDF/XML usamos el siguiente esquema:

    <rdf:Description>
      <ex:editor>
        <rdf:Description>
          <ex:homePage>
            <rdf:Description>
            </rdf:Description>
          </ex:homePage>
        </rdf:Description>
      </ex:editor>
    </rdf:Description>

    Nótese que sólo es un ESQUEMA de cómo se tiene que construir NO es el resultado final.

    Hay que observar que el camino que marcamos nos indica el como debemos de establecer los recursos y las propiedades, de forma anidada :)

    Sin embargo, aún le faltan varios datos, de hecho sólo basta agregar el nombre de los recursos a los que nos referimos de manera similar a como se dijo en la sección 3. De ésta forma tendríamos como resultado:

       <rdf:Description
    rdf:about="http://www.example.org/index.html">

    <ex:editor>
    <rdf:Description>
    <ex:homePage>
    <rdf:Description rdf:about="http://www.yahoo.com/fulanito.html">
    </rdf:Description>
    </ex:homePage>
    </rdf:Description>
    </ex:editor>

    </rdf:Description>

    Y sólo lo que hicimos fue agregar el recurso que describimos en cada una de las descripciones y para el caso del nodo blanco no escribimos ningún recurso.

    Si describimos de la misma forma los demás atributos tenemos el siguiente resultado:

    1.   <rdf:Description rdf:about="http://www.example.org/index.html">
    2. <ex:editor>
    3. <rdf:Description>
    4. <ex:homePage>
    5. <rdf:Description rdf:about="http://www.yahoo.com/fulanito.html">
    6. </rdf:Description>
    7. </ex:homePage>
    8. </rdf:Description>
    9. </ex:editor>
    10. </rdf:Description>


    11. <rdf:Description rdf:about="http://www.example.org/index.html">
    12. <ex:editor>
    13. <rdf:Description>
    14. <ex:fullName>Fulanito De Tal</ex:fullName>
    15. </rdf:Description>
    16. </ex:editor>
    17. </rdf:Description>

    18. <rdf:Description rdf:about="http://www.example.org/index.html">
    19. <dc:title>Welcome</dc:title>
    20. </rdf:Description>

    Sólo notemos que en caso de que el último nodo de la secuencia no sea un recurso, tenemos que escribir la etiqueta completa y no sólo el atributo. Éstas líneas se pueden reducir más pero es más comprensible de éste modo. Por lo que lo dejaremos ahí. Para más referencias consultar Node Elements and Property Elements

    5 Conclusiones

    En resumen, tenemos que RDF es un lenguaje de modelado de los recursos en la web y de su metainformación. Ésto es, que no sólo permite describir archivos, imágenes, etcétera, sino que también nos dá la posibilidad de expresar (dentro del mismo modelo), la información sobre esos recursos. La representación tiene como uno de sus principales modelos el de gráficas, y la presentación del modelo en RDF/XML se dá de forma directa.

    A pesar de que RDF tiene una definición de recursos más restringida que RDFS, nos proporciona otra cantidad de herramientas para la representación de otro tipo de información, como son las colecciones de objetos con repetición y sin orden (rdf:bag), colecciones de objetos con posibles duplicados pero con absoluta relevancia en el orden (rdf:seq) o colecciones de objetos alternativos (rdf:Alt).

    Mientras tanto, RDFS nos provee de una extensión de RDF donde define nuevos conceptos introduciendo el uso de propiedades y clases dentro de la descripción de los enunciados. Por "clase" se intiende una categoría de recursos, mientras que por "propiedad" se entiende como una clase con características (rdfs:range, rdfs:domain) que describe el tipo de relaciones entre las clases.

    La ventaja de utilizar XML para la presentación del modelo proporcionado por RDF es evidente (se dá por las mismas ventajes que tiene XML). Sin embargo, también nos muestra que no tenemos una única manera de representar la información (esencialmente vislumbrada por las formas de presentación de los nodos en blanco), lo que nos puede causar conflictos al tratar de comparar modelos que representen la misma información semántica.

    ¿Qué podemos decir que hemos aprendido de éste documento a final de cuentas? Pues que RFD y RDFS nos proveen de un método fácil para la representación de varios grados de información y de tal forma que nos sirve para cumplir nuestro propósito dentro del desarrollo del web semántico. Además de que nos permite ampliar nuestro vocabulario a nuestra propia conveniencia, por lo que no sólo se es aplicable en ésta área, sino que también a cualquier otra en la que se pueda aprovechar éste tipo de manejo de la información.

    6 Referencias

    1. RFC 2396 -Uniform Resource Identifiers (URI): Generic Syntax
    2. The Dublin Core Element Set v1.1 namespace
    3. RDF/XML Syntax Specification (Revised)
    4. RDF Vocabulary
    5. RDFS
    6. Node Elements and Property Elements
    7. Naming and Addressing: URIs, URLs,...
    8. ¿Qué es un recurso?
    9. RDF Primer

    10. Grecia García García
      Última modificacion: Lunes, 16 de junio del 2003.15:40hrs 1