Sparql: Breve introducción

SPARQL

SPARQL es un acrónimo recursivo del inglés SPARQL Protocol and RDF Query Language. Se trata de un lenguaje estandarizado para la consulta de grafos RDF, normalizado por el RDF Data Access Working Group (DAWG) del World Wide Web Consortium (W3C). Es una tecnología clave en el desarrollo de la Web Semántica.

SPARQL actualmente está definida en su versión 1.1, en el documento http://www.w3.org/TR/sparql11-query, en el que en parte se fundamenta la presente introducción.

En otras palabras, SPARQL es la forma de explotar la información contenida en la web semántica.

Aunque el presente documento se fundamenta en el lenguaje de consulta propiamente dicho, el estándar SPARQL 1.1 contempla también la sintaxis para construir sentencias de actualización y construcción de ternas (INSERT, DELETE, etc.).

Estructura

Una sentencia SPARQL comprende las siguientes secciones:

  • Prefijos [PREFIX]: Para abreviar las URIs de la consulta.
  • Definición del Dataset [FROM] : Establecen los grafos RDF que serán utilizados (opcional).
  • Resultados [SELECT]: Que selecciona los resultados a mostrar.
  • Patrón de consulta [WHERE]: Las condiciones que deben cumplir los resultados.
  • Modificadores: modifican los resultados obtenidos, por ejemplo reordenándolos (ORDER BY).
  • Variables: Empiezan con ? y pueden sustituir cualquier nodo (recurso o literal).

Figura: Consulta SPARQL: Secciones

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX card: <http://www.w3.org/People/Berners-Lee/card#>
SELECT ?homepage
FROM <http://www.w3.org/People/Berners-Lee/card>
WHERE {
    card:i foaf:knows ?known .
    ?known foaf:homepage ?homepage .
} ORDER BY DESC(?homepage)

Infraestructura

Un SPARQL endpoint acepta consultas SPARQL y devuelve los resultados vía HTTP. Pueden ser de dos tipos:

Puede ver una lista de SPARQL endpoints en http://www.w3.org/wiki/SparqlEndpoints.

Los resultados de una consulta pueden ser devueltos en diversos formatos: XML, JSON, RDF, HTML, etc.

Dataset FOAF

Un Dataset típico es el FOAF (Friend of a Friend) que describe las relaciones interpersonales.

Figura: Todos los nombres posibles

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE {
    ?person foaf:name ?name .
}

Dataset DBPedia

DBPedia es la versión RDF de información derivada de la Wikipedia, conteniendo alrededor de 100 millones de tripletas.

DBPedia endpoint: http://dbpedia.org/sparql

NOTA: A partir de éste punto, los ejemplos del presente documento se basarán en el DBPedia endpoint.

Patrones de Consulta

  • BGP (Basic Graph Pattern): Es la forma mas simple de patrones describiendo un grafo mediante ternas, usando URIs, literales o variables donde corresponda. El patrón mas simple sería **?s ?p ?o .

    Figura: Todos los libros (limitado a los 1000 primeros resultados)

    PREFIX dbprop: <http://dbpedia.org/property/>
    PREFIX dbclass: <http://dbpedia.org/class/>
    SELECT ?object
    WHERE {
      ?object rdf:type dbclass:Book .
    }
    LIMIT 1000
    

    Figura: Todos los títulos de libros

    PREFIX dbprop: <http://dbpedia.org/property/>
    PREFIX dbclass: <http://dbpedia.org/class/>
    SELECT ?title
    WHERE {
      ?object rdf:type dbclass:Book .
      ?object dbprop:name ?title .
    }
    LIMIT 1000
    
  • Listas de Predicados-Objetos: La nomenclatura permite abreviar diferentes patrones mediante el uso de ";" y "," en vez del terminador ".".

    • Uso del ";":

      ?x  dbprop:author  ?autor ;
      dbprop:isbn  ?isbn .
      

      Sería equivalente a:

      ?x  dbprop:author  ?autor .
      ?x  dbprop:isbn  ?isbn .
      
    • Uso del ",":

      ?x  dbprop:author  "Cervantes", "Cervantes_" .
      

      Sería equivalente a:

      ?x  dbprop:author  "Cervantes" .
      ?x  dbprop:author  "Cervantes_" .
      
  • Usando Literales: Pueden utilizarse directamente con entrecomillado o utilizar modificadores para matizar su concordancia (mas información: http://skos.um.es/TR/rdf-sparql-query/#matchingRDFLiterals ).

    ?a ?p "cat" .
    ?b ?p "cat"@en .
    ?c ?p "42"^^xsd:integer .
    
    • ?a se corresponde con el literal "cat" sin identificación de idioma.
    • ?b se corresponde con el literal "cat" en idioma inglés.
    • ?c se corresponde con el literal 42 con el tipo integer.

    Figura: Busca "Lo que el viento se llevó" en español

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX dbprop: <http://dbpedia.org/property/>
    PREFIX dbclass: <http://dbpedia.org/class/>
    SELECT ?object 
    WHERE {
      ?object rdf:type dbclass:Book .
      ?object rdfs:label "Lo que el viento se llevó"@es .
    }
    LIMIT 1000
    
  • Rdf:type Se puede utilizar la palabra clave "a" como un predicado en un patrón de tripleta; es una alternativa para la IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type. Esta palabra clave es sensible a las mayúsculas.

        ?x  a  :Class1 .
    

    es equivalente a:

      ?x    rdf:type  :Class1 .
  • Filtros [FILTER]: selecciona solo las soluciones que cumplen la condición indicada (mas información: http://skos.um.es/TR/rdf-sparql-query/#termConstraint).

    Figura: Busca Libros de menos de 100 páginas

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX dbowl: <http://dbpedia.org/ontology/>
    PREFIX dbprop: <http://dbpedia.org/property/>
    PREFIX dbclass: <http://dbpedia.org/class/>
    SELECT ?object ?npages
    WHERE {
      ?object a dbclass:Book .
      ?object dbowl:numberOfPages ?npages .
    FILTER (?npages < 100)
    }
    LIMIT 1000
    
    • Ámbito de los filtros: Una restricción, expresada con FILTER, actúa sobre el grupo completo en el que aparece el filtro. Los siguientes patrones tienen todos las mismas soluciones:
           {  ?x foaf:name ?name .
              ?x foaf:mbox ?mbox .
              FILTER regex(?name, "Smith")
           }
      
           {  FILTER regex(?name, "Smith")
              ?x foaf:name ?name .
              ?x foaf:mbox ?mbox .
           }
      
  • Concordancias Alternativas [UNION]: SPARQL provee de un mecanismo para seleccionar patrones alternativos, equivalentes al tradicional OR, mediante la clausula UNION.

    Figura: Libros de menos de 500 páginas de Stephen King o de Michael Crichton ordenados por número de páginas

    PREFIX dbowl: <http://dbpedia.org/ontology/>
    PREFIX dbclass: <http://dbpedia.org/class/>
    SELECT ?object ?autor ?npages
    WHERE {
      ?object a dbclass:Book .
      ?object dbowl:author ?autor .
      ?object dbowl:numberOfPages ?npages .
      FILTER (?npages < 500)
      { 
          ?object dbowl:author <http://dbpedia.org/resource/Stephen_King> . 
      } UNION { 
          ?object dbowl:author <http://dbpedia.org/resource/Michael_Crichton> .
      }
    }
    ORDER BY ?npages
    LIMIT 1000