Este artículo necesita citas adicionales para su verificación . ( marzo de 2013 ) |
Paradigma | Lenguaje de consulta |
---|---|
Revelador | W3C |
Apareció por primera vez | 15 de enero de 2008 ( 15 de enero de 2008 ) |
Versión estable | 1.1 / 21 de marzo de 2013 ( 21-03-2013 ) |
Sitio web | www.w3.org/TR/sparql11-query/ |
Implementaciones principales | |
Apache Jena , [1] OpenLink Virtuoso [1] |
SPARQL (pronunciado "sparkle", un acrónimo recursivo [2] de SPARQL Protocol and RDF Query Language ) es un lenguaje de consulta RDF —es decir, un lenguaje de consulta semántico para bases de datos— capaz de recuperar y manipular datos almacenados en formato Resource Description Framework (RDF) . [3] [4] Fue convertido en estándar por el RDF Data Access Working Group (DAWG) del World Wide Web Consortium , y es reconocido como una de las tecnologías clave de la web semántica . El 15 de enero de 2008, SPARQL 1.0 fue reconocido por el W3C como una recomendación oficial, [5] [6] y SPARQL 1.1 en marzo de 2013. [7]
SPARQL permite que una consulta conste de patrones triples , conjunciones , disyunciones y patrones opcionales . [8]
Existen implementaciones para múltiples lenguajes de programación . [9] Existen herramientas que permiten conectar y construir de forma semiautomática una consulta SPARQL para un punto final SPARQL, por ejemplo ViziQuer. [10] Además, existen herramientas para traducir consultas SPARQL a otros lenguajes de consulta, por ejemplo a SQL [11] y a XQuery . [12]
SPARQL permite a los usuarios escribir consultas que siguen la especificación RDF del W3C . De esta forma, todo el conjunto de datos está formado por tripletas "sujeto-predicado-objeto". Los sujetos y predicados son siempre identificadores URI, pero los objetos pueden ser URI o valores literales. Este esquema físico único de 3 "columnas" está hiperdesnormalizado, ya que lo que sería un registro relacional con 4 campos ahora son 4 tripletas en las que el sujeto se repite una y otra vez, el predicado es esencialmente el nombre de la columna y el objeto es el valor del campo. Aunque esto parece complicado de manejar, la sintaxis SPARQL ofrece estas características:
1. Los sujetos y objetos se pueden utilizar para encontrar al otro, incluso de forma recursiva.
A continuación se muestra un conjunto de triples. Debe quedar claro que ex:sw001
y ex:sw002
enlaza a ex:sw003
, que a su vez tiene enlaces:
ex : sw001 ex : linksWith ex : sw003 . ex : sw002 ex : linksWith ex : sw003 . ex : sw003 ex : linksWith ex : sw004 , ex : sw006 . ex : sw004 ex : linksWith ex : sw005 .
En SPARQL, la primera vez que se encuentra una variable en la secuencia de expresiones, se llena con result. La segunda vez y las subsiguientes, se utiliza como entrada. Si asignamos ("vinculamos") el URI ex:sw003
a la ?targets
variable, entonces se envía un result a ?src
; esto nos indica todas las cosas que se vinculan a ex:sw003
(dependencia ascendente):
SELECCIONAR * DONDE { VINCULAR ( ej .: sw003 AS ?objetivos ) ?src ej .: linksWith ?objetivos . }
Pero con un simple cambio de la variable de enlace, el comportamiento se invierte. Esto producirá todas las cosas de las que ex:sw003
depende (dependencia descendente):
SELECT * WHERE { BIND ( ej .: sw003 AS ?src ) ?src ej .: linksWith ?targets . # ¡AVISO! ¡Sin cambios de sintaxis! }
Aún más atractivo es que podemos indicar fácilmente a SPARQL que siga la ruta recursivamente:
SELECT * WHERE { BIND ( ex : sw003 AS ?src ) ?src ex : linksWith + ?targets . # Tenga en cuenta el +; ahora SPARQL encontrará ex:sw005 a través de ex:sw004 }
Por lo tanto, las variables enlazadas también pueden ser listas y se puede operar con ellas sin necesidad de una sintaxis complicada. El efecto de esto es similar al siguiente:
Si ?S está ligado a ( ej .: A , ej .: B ) entonces ?S ex : linksWith ?O se comporta así : para cada s en ? S : obtener s ex : linksWith , capturar o agregar o a ?O Si ?O está ligado a ( ej : A , ej : B ) entonces ? S ex : linksWith ?O se comporta así : para cada o en ?O : fetch ex : linksWith o , captura s y añade s a ?S
2. Las expresiones SPARQL son una canalización
A diferencia de SQL, que tiene subconsultas y CTE, SPARQL se parece mucho más a MongoDB o SPARK. Las expresiones se evalúan exactamente en el orden en que se declaran, incluido el filtrado y la unión de datos. El modelo de programación se convierte en lo que sería una declaración SQL con múltiples cláusulas WHERE. La combinación de sujetos y objetos que reconocen listas más un enfoque de canalización puede generar consultas extremadamente expresivas que abarcan muchos dominios de datos diferentes.
A diferencia de las bases de datos relacionales, la columna de objeto es heterogénea: el tipo de datos del objeto, si no es un URI, suele estar implícito (o especificado en la ontología ) en el valor del predicado . Los nodos literales llevan información de tipo coherente con el espacio de nombres XSD subyacente, incluidos enteros cortos y largos con y sin signo, flotantes de precisión simple y doble, fecha y hora, decimales con precisión de centavo, booleanos y cadenas. Las implementaciones de almacenamiento triple en bases de datos relacionales tradicionales normalmente almacenarán el valor como una cadena y una cuarta columna identificará el tipo real. Las bases de datos polimórficas como MongoDB y SQLite pueden almacenar el valor nativo directamente en el campo de objeto.
Por lo tanto, SPARQL proporciona un conjunto completo de operaciones de consulta analítica como JOIN
, SORT
, AGGREGATE
para datos cuyo esquema es intrínsecamente parte de los datos en lugar de requerir una definición de esquema separada. Sin embargo, la información del esquema (la ontología) a menudo se proporciona externamente, para permitir la unión de diferentes conjuntos de datos de manera inequívoca. Además, SPARQL proporciona una sintaxis de recorrido de grafos específica para datos que pueden considerarse como un grafo.
El siguiente ejemplo demuestra una consulta simple que aprovecha la definición de ontologíafoaf
("amigo de un amigo").
Específicamente, la siguiente consulta devuelve los nombres y correos electrónicos de cada persona en el conjunto de datos :
PREFIJO foaf : <http://xmlns.com/foaf/0.1/> SELECCIONAR ?nombre ?correo electrónico DONDE { ?persona a foaf : Persona . ?persona foaf : nombre ?nombre . ?persona foaf : mbox ?correo electrónico . }
Esta consulta une todos los triples con un sujeto coincidente, donde el predicado de tipo, " a
", es una persona ( foaf:Person
), y la persona tiene uno o más nombres ( foaf:name
) y buzones de correo ( foaf:mbox
).
Para facilitar la lectura, el autor de esta consulta eligió hacer referencia al sujeto utilizando el nombre de variable " ?person
". Dado que el primer elemento del triple siempre es el sujeto, el autor podría haber utilizado fácilmente cualquier nombre de variable, como " ?subj
" o " ?x
". Cualquiera sea el nombre elegido, debe ser el mismo en cada línea de la consulta para indicar que el motor de consultas debe unir los triples con el mismo sujeto.
El resultado de la unión es un conjunto de filas: ?person
, ?name
, ?email
. Esta consulta devuelve ?name
y ?email
porque ?person
suele ser una URL compleja en lugar de una cadena de texto fácil de entender. Tenga en cuenta que cualquier ?person
puede tener varios buzones de correo, por lo que en el conjunto devuelto, una ?name
fila puede aparecer varias veces, una por cada buzón de correo.
Esta consulta se puede distribuir a múltiples puntos finales SPARQL (servicios que aceptan consultas SPARQL y devuelven resultados), calcular y recopilar resultados, un procedimiento conocido como consulta federada .
Ya sea de manera federada o local, definiciones triples adicionales en la consulta podrían permitir uniones a diferentes tipos de temas, como automóviles, para permitir consultas simples, por ejemplo, para devolver una lista de nombres y correos electrónicos de personas que conducen automóviles con una alta eficiencia de combustible.
En el caso de consultas que leen datos de la base de datos, el lenguaje SPARQL especifica cuatro variaciones de consulta diferentes para diferentes propósitos.
SELECT
consultaCONSTRUCT
consultaASK
consultaDESCRIBE
consultaCada una de estas formas de consulta toma un WHERE
bloque para restringir la consulta, aunque, en el caso de la DESCRIBE
consulta, el WHERE
es opcional.
SPARQL 1.1 especifica un lenguaje para actualizar la base de datos con varias formas de consulta nuevas. [13]
Otro ejemplo de consulta SPARQL que modela la pregunta "¿Cuáles son todas las capitales de los países de África?":
PREFIJO ej : <http://example.com/exampleOntology#> SELECCIONAR ?capital ?país DONDE { ?x ej : nombredeciudad ?capital ; ej : isCapitalOf ?y . ?y ej : nombredepaís ?país ; ej : isInContinent ej : África . }
Las variables se indican con un prefijo ?
o . Se devolverán los enlaces para y . Cuando un triple termina con un punto y coma, el sujeto de este triple completará implícitamente el siguiente par para formar un triple completo. Por ejemplo, es la abreviatura de .$
?capital
?country
ex:isCapitalOf ?y
?x ex:isCapitalOf ?y
El procesador de consultas SPARQL buscará conjuntos de triples que coincidan con estos cuatro patrones de triples, vinculando las variables en la consulta a las partes correspondientes de cada triple. Es importante tener en cuenta aquí la "orientación de la propiedad" (las coincidencias de clases se pueden realizar únicamente a través de atributos de clase o propiedades; consulte Tipado Duck ).
Para que las consultas sean concisas, SPARQL permite la definición de prefijos y URI base de manera similar a Turtle . En esta consulta, el prefijo " ex
" representa “ http://example.com/exampleOntology#
”.
GeoSPARQL define funciones de filtro para consultas de sistemas de información geográfica (SIG) utilizando estándares OGC bien entendidos ( GML , WKT , etc.).
SPARUL es otra extensión de SPARQL. Permite actualizar el almacén RDF con este lenguaje de consulta declarativo, agregando métodos INSERT
y DELETE
.
XSPARQL es un lenguaje de consulta integrado que combina XQuery con SPARQL para consultar fuentes de datos XML y RDF a la vez. [14]
Implementaciones SPARQL de referencia y de código abierto
Consulte la Lista de implementaciones de SPARQL para obtener una cobertura más completa, incluidos triplestore , API y otros almacenamientos que han implementado el estándar SPARQL.