La semana pasada estuve investigando un poco sobre la web semántica y cómo utilizar los datos de ella para construir sistemas de pregunta-respuesta. Hoy, voy a leer un poquito más sobre qué es RDF.
Un triplet de RDF simplemente establece una relación entre dos recursos. El sujeto y el objeto son los elementos que relacionamos y el predicado es el tipo de relación que hay entre ellos. Esa relación entre el sujeto y el objeto representará lo que en RDF se llama una «propiedad«.
Sample triples (informal), pseudocode.
<Bob> <is a> <person>.
<Bob> <is a friend of> <Alice>.
<Bob> <is born on> <the 4th of July 1990>.
<Bob> <is interested in> <the Mona Lisa>.
<the Mona Lisa> <was created by> <Leonardo da Vinci>.
<the video 'La Joconde à Washington'> <is about> <the Mona Lisa>
Estas relaciones conformarán grafos dirigidos (con una dirección concreta). Podemos hacer preguntas sobre la información de estos grafos con SPARQL.
Existen tres tipos de datos que pueden aparecer en estos nodos:
- IRIs: el ID del recurso, similar a la URL de una web (de hecho una URL es un tipo específico de IRI), a lo que apunta. Pueden aparecer en el sujeto, el objeto o el predicado.
- literales: strings, números, fechas, etc. Sólo pueden ser objetos.
- nodos vacíos o variables. Representan elementos sin un identificador. Pueden ser objetos o sujetos. Esa parte del cuadro de la Mona Lisa es un ejemplo de nodo vacío.

Un dataset de RDF estará consituido por varios grafos. Cada grafo dentro de un dataset tendrá asociado su IRI. Por ejemplo:

RDF SCHEMA
Los recursos serán clasificados en CLASES y subclases que especifican las categorías a las que pertenecen. Asimismo, existirán distintos TIPOS de propiedades. Así, se podrán crear jerarquías de clases y subclases y de tipos y subtipos de recursos. Las restricciones por tipo serán definidas por los DOMINIOS o los RANGOS de las propiedades. Queda más claro, en esta tabla:
Construct | Syntactic form | Description |
---|---|---|
Class (a class) | C rdf:type rdfs:Class | C (a resource) is an RDF class |
Property (a class) | P rdf:type rdf:Property | P (a resource) is an RDF property |
type (a property) | I rdf:type C | I (a resource) is an instance of C (a class) |
subClassOf (a property) | C1 rdfs:subClassOf C2 | C1 (a class) is a subclass of C2 (a class) |
subPropertyOf (a property) | P1 rdfs:subPropertyOf P2 | P1 (a property) is a sub-property of P2 (a property) |
domain (a property) | P rdfs:domain C | domain of P (a property) is C (a class) |
range (a property) | P rdfs:range C | range of P (a property) is C (a class) |
Con este RDF Schema podremos crear modelos de datos RDF como el siguiente:
Example 5: RDF Schema triples (informal)
<Person> <type> <Class> <is a friend of> <type> <Property> <is a friend of> <domain> <Person> <is a friend of> <range> <Person> <is a good friend of> <subPropertyOf> <is a friend of>
Ejemplos de vocabularios RDF
- FOAF (Friend of a Friend)
- Dublin Core
- Schema.org
- SKOS
Formatos para crear grafos RDF
Lo copio directamente de la web que estoy consultando:
- Turtle family of RDF languages (N-Triples, Turtle, TriG and N-Quads);
- JSON-LD (JSON-based RDF syntax);
- RDFa (for HTML and XML embedding);
- RDF/XML (XML syntax for RDF).
El que más me interesa es el JSON-LD, ya que es que el veo que más están pidiendo, así que sigo con este. El JSON-LD sigue la sintaxis de los documentos JSON para crear grafos y datasets de RDF. JSON-LD se puede utilizar para transformar documentos en JSON a RDF con cambios mínimos.
Example 12: JSON-LD
01 {
02 "@context": "example-context.json",
03 "@id": "http://example.org/bob#me",
04 "@type": "Person",
05 "birthdate": "1990-07-04",
06 "knows": "http://example.org/alice#me",
07 "interest": {
08 "@id": "http://www.wikidata.org/entity/Q12418",
09 "title": "Mona Lisa",
10 "subject_of": "http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619",
11 "creator": "http://dbpedia.org/resource/Leonardo_da_Vinci"
12 }
13 }
Ejemplos de datasets de RDF
- Wikidata
- DBpedia
- WordNet
- Europeana
- VIAF
Debido a que los grafos son el resultado de distintas relaciones entre recursos, también podemos inducir propiedades de elementos que no están directamente relacionados en nuestro grafo. Por ejemplo, si sabemos que <Bob> <conoce a> <Ana>, entonces podemos deducir que <Bob> <es una> <persona> puesto que en nuestro grafo también definíamos el predicado <conoce a> como una relación entre dos <personas>.