wikidata-bvmc-sparql

Tutorial de inicio a SPARQL

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 como se definen las tripletas de acuerdo a los vocabularios previamente definidos 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 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 editable por cualquier persona por lo que es normal que no sea homogéneo y puedas encontrar autores con diferentes tipos y propiedades, sin seguir el mismo patrón. Desde el interfaz de consultas podemos crearlas de forma intuitiva gracias al asistente. En la parte derecha, podemos escribir directamente nuestras propias consultas. Para las propiedades el espacio de nombres a utilizar es wd: mientras que para las entidades el espacio de nombres es wdt:. 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 chuleta para crear las consultas de Wikidata. Esperamos que os sirva de ayuda!

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

47 − = 39