Tutorial de inicio a SPARQL

25/10/2018

Introducción

El lenguaje de consulta SPARQL es una especificación propuesta por el W3C, que proporciona una sintaxis para manipular grafos RDF en la web y en repositorios de datos.

Como es sabido, RDF se basa en tripletas que definen un universo que contiene entidades y propiedades. En el siguiente ejemplo se puede observar cómo se definen las tripletas de acuerdo a los vocabularios FOAF y RDFS. Básicamente, se define que la entidad Gustavo es de tipo persona, que su nombre es Gustavo y su correo electrónico.

@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<http://example.org/gustavo#me> a foaf:Person .
<http://example.org/gustavo#me> foaf:name "Gustavo" .
<http://example.org/gustavo#me> foaf:mbox <mailto:gustavo@example.org> .

Si esta información la almacenamos en un repositorio RDF podríamos ejecutar consultas SPARQL para obtener información. La estructura básica de SPARQL es la siguiente:

PREFIX ex: <example.org>
SELECT *
WHERE { tripletas }
OFFSET 0
LIMIT 10

Las tripletas se componen de elementos que siguen el patrón sujeto predicado objeto, como por ejemplo, Gustavo trabaja en la BVMC. En el siguiente ejemplo podemos observar como obtenemos cualquier resultado. Si el término comienza por el símbolo ? quiere decir que es una variable.

PREFIX ex: <example.org>
SELECT *
WHERE { ?s ?p ?o }

Si queremos obtener todas las entidades cuyo nombre sea «Gustavo», debemos filtrar de la siguiente forma:

PREFIX ex: <example.org>
SELECT *
WHERE { ?s foaf:name "Gustavo" }

Los filtros de las tripletas se concatenan con el punto. Así, si queremos obtener las entidades de tipo persona y con nombre Gustavo ejecutaríamos el siguiente SPARQL:

PREFIX ex: <example.org>
SELECT *
WHERE { 
       ?s a foaf:Person .
       ?s foaf:name "Gustavo" 
}

Puede darse el caso de que una entidad no tenga valor para una propiedad y no nos importe obtenerla como resultado. Para ello utilizamos la instrucción OPTIONAL:

PREFIX ex: <example.org>
SELECT *
WHERE { 
       ?s a foaf:Person .
       OPTIONAL { ?s foaf:name "Gustavo" }
}

De forma adicional, es posible ejecutar expresiones regulares sobre cadenas de texto. El siguiente ejemplo ilustra cómo es posible ejecutar expresiones regulares sobre texto mediante la instrucción FILTER regex:

PREFIX ex: <example.org> 
SELECT * 
WHERE { ?s a foaf:Person . 
        ?s foaf:name ?name .
       FILTER regex(?name, "^Gustavo")  
}

SPARQL también provee funciones de agregado como SQL. El siguiente ejemplo muestra el uso de COUNT y retorna el número de personas cuyo nombre comienza por el texto «Gustavo».

PREFIX ex: <example.org> 
SELECT (count(distinct ?s) as ?count) 
WHERE { 
?s a foaf:Person . 
?s foaf:name ?name . 
FILTER regex(?name, "^Gustavo") }

 

SPARQL en Wikidata

Wikidata es una base de conocimiento colaborativa y editable por cualquier persona. Por esta razón, las propiedades utilizadas para describir al autor pueden ser diferentes. Desde la interfaz de consultas podemos crear las sentencias SPARQL de forma intuitiva gracias al asistente. Para las propiedades, el espacio de nombres a utilizar es wdt:, mientras que para las entidades el espacio de nombres es wd:. Por ejemplo, la entidad Miguel de Cervantes Saavedra en Wikidata corresponde a wd:Q5682, que tiene para la propiedad nacionalidad wdt:P27, el valor España, que a su vez, corresponde en Wikidata a wd:Q29. Al introducir el espacio de nombres, si pulsamos las teclas Ctrl y espacio, nos ofrece ayuda para completar las propiedades. Por ejemplo, al escribir BVMC, el interfaz nos devolverá automáticamente las propiedades que enlazan a la Biblioteca Virtual Miguel de Cervantes, en su versión de datos abiertos.

La siguiente consulta devuelve los autores que se encuentran enlazados al catálogo de datos abiertos de la Biblioteca Virtual Miguel de Cervantes. La propiedad P2799 permite enlazar autores a la BVMC y la propiedad P3976 enlaza obras.

SELECT *
WHERE {?s wdt:P2799 ?idautor}

Adicionalmente, la BVMC y Wikidata se encuentran federados. Esto significa que podemos consultar los datos de la BVMC a través de Wikidata. Os adjuntamos un pequeño ejemplo que devuelve las obras de Lope de Vega.

SELECT ?workLabel 
WHERE {
  wd:Q165257 wdt:P2799 ?id 
  BIND(uri(concat("http://data.cervantesvirtual.com/person/", ?id)) as ?bvmcID)
  SERVICE <http://data.cervantesvirtual.com/openrdf-sesame/repositories/data> {
  ?bvmcID <http://rdaregistry.info/Elements/a/authorOf> ?work .
  ?work rdfs:label ?workLabel 
}

Nuestro compañero de Wikidata, David Abián, nos adjunta una guía para crear las consultas de Wikidata. ¡Esperamos que os sirva de ayuda!