Articulo de referencia

SPARQL

[[Virtuoso Universal Server|OpenLink Virtuoso]] "},"dialects":{"wt":""},"website":{"wt":"{{URL|http://www.w3.org/TR/sparql11-query/}}"}},"i":0}}]}"> SPARQL (pronunciado " sparkl...

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 recomendación oficial, [ 5 ] [ 6 ] y SPARQL 1.1 en marzo de 2013. [ 7 ]

El Servicio de Consulta de Wikidata se puede utilizar para consultar datos de Wikidata utilizando SPARQL [ 8 ] [ 9 ]

SPARQL permite que una consulta consista en patrones de triples , conjunciones , disyunciones y patrones opcionales . [ 10 ]

Existen implementaciones para múltiples lenguajes de programación . [ 11 ] Existen herramientas que permiten conectar y construir semiautomáticamente una consulta SPARQL para un punto final SPARQL, por ejemplo ViziQuer. [ 12 ] Además, existen herramientas para traducir consultas SPARQL a otros lenguajes de consulta, por ejemplo a SQL [ 13 ] y a XQuery . [ 14 ]

Características

SPARQL permite a los usuarios escribir consultas que siguen la especificación RDF del W3C . Por lo tanto, todo el conjunto de datos son 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 tres "columnas" está hipernormalizado, de modo que lo que sería un registro relacional con (por ejemplo) cuatro columnas ahora son cuatro tripletas donde el sujeto se repite una y otra vez, el predicado es esencialmente el nombre de la columna y el objeto es el valor de la columna. La sintaxis SPARQL ofrece estas características:

1. Los sujetos y los objetos pueden usarse para encontrar al otro, incluso de forma transitiva.

A continuación se muestra un conjunto de triples. Debería quedar claro que ex:sw001y ex:sw002enlazan a ex:sw003, que a su vez tiene enlaces:

ej .: sw001 ej .: enlacesCon ej .: sw003 . ej .: sw002 ej .: enlacesCon ej .: sw003 . ej .: sw003 ej .: enlacesCon ej .: sw004 , ej .: sw006 . ej .: sw004 ej .: enlacesCon ej .: sw005 .

En SPARQL, la primera vez que se encuentra una variable en la secuencia de expresiones, se rellena con el resultado. La segunda vez y las siguientes, se utiliza como entrada. Si asignamos ("vinculamos") la URI ex:sw003a la ?targetsvariable, entonces se introduce un resultado en ?src; esto nos indica todo lo que se vincula conex:sw003 (dependencia ascendente):

SELECT * WHERE { BIND ( ex : sw003 AS ?targets ) ?src ex : linksWith ?targets . # ?src se rellena con ex:sw001, ex:sw002 }

Pero con un simple cambio de la variable de enlace, el comportamiento se invierte. Esto producirá todo aquello de lo que ex:sw003depende (dependencia descendente):

SELECT * WHERE { BIND ( ex : sw003 AS ?src ) ?src ex : linksWith ?targets . # ¡NOTA! ¡Sin cambios de sintaxis! ?targets se rellena con ex:sw004, ex:sw006 }

Aún más atractivo es que podemos instruir fácilmente a SPARQL para que siga la ruta de forma transitiva:

SELECCIONAR * DONDE { ENLAZAR ( ej : sw003 COMO ?src )# Nótese el +; ahora SPARQL también encontrará ex:sw005 transitivamente a través de ex:sw004; ?targets es ex:sw004, ex:sw005, ex:sw006 ?src ex : linksWith + ?targets . }

Por lo tanto, las variables vinculadas también pueden ser listas y se operará con ellas sin una sintaxis complicada. El efecto de esto es similar al siguiente pseudocódigo :

Si ?S está vinculado a ( ej : A , ej : B ) y ?O no está vinculado , entonces ?S ej : linksWith ?O se comporta como una cadena hacia adelante : para cada s en ?S : para cada fetch ( s , ej : linksWith ): captura o agrega o a ?OSi ?O está vinculado a ( ej : A , ej : B ) y ?S no está vinculado , entonces ?S ej : linksWith ?O se comporta como una cadena hacia atrás : para cada o en ?O : para cada fetch ( ej : linksWith , o ): captura s agrega s a ?S

2. Las expresiones SPARQL son una canalización

A diferencia de SQL, que tiene subconsultas y CTEs, SPARQL se parece mucho más a MongoDB o SPARK. Las expresiones se evalúan exactamente en el orden en que se declaran, incluyendo el filtrado y la unión de datos. El modelo de programación se asemeja a una sentencia SQL con múltiples cláusulas WHERE. La combinación de sujetos y objetos que reconocen listas, junto con un enfoque de canalización, puede generar consultas extremadamente expresivas que abarcan muchos dominios de datos diferentes. La operación JOIN, tal como se usa en los sistemas de gestión de bases de datos relacionales (RDBMS), y la comprensión de su dinámica (por ejemplo, qué columna de qué tabla es adecuada para unirse a otra, interna frente a externa, etc.) no es relevante en SPARQL (y en cierto modo es más simple) porque los objetos, si son URI y no literales, implícitamente solo se pueden usar para encontrar un sujeto. Aquí hay un ejemplo más completo que ilustra la canalización usando algunos atajos de sintaxis.

# SELECCIONA solo los valores terminales que necesitamos. Si hiciéramos SELECT * (lo cual # no es necesariamente malo), entonces las variables "intermedias" ?vendor y ?owner # serían parte de la salida. SELECT ?slbl ?vlbl ?lei ?lname WHERE { # ?sw no está vinculado. Establece el predicado en rdf:type y el objeto en ex:Software # y recopila todas las instancias de software. Al mismo tiempo, extrae la etiqueta del software # (una descripción concisa) y completa ?slbl y también captura el # objeto vendor en ?vendor. ?sw rdf : type ex : Software ; rdfs : label ?slbl ; ex : vendor ?vendor .# Lo anterior en "manualidad" revela el proceso de enlace: # ?sw rdf:type ex:Software . # ?sw UNBOUND; se establece aquí # ?sw rdfs:label ?slbl . # ?sw bound; establecer unbound ?slbl # ?sw ex:vendor ?vendor . # ?sw still bound; establecer ?vendor# Excluir software de código abierto. Nota: ex:oss es una URI porque es # una cadena sin comillas: FILTER ( ?vendor NOT IN ( ex : oss ))# A continuación, profundizamos en el objeto ?vendor y extraemos el identificador de entidad legal # y el propietario de los datos, donde el propietario también es un objeto. ?vendor está # vinculado; ?vlbl, ?lei y ?owner no están vinculados y se completarán: ?vendor rdfs : etiqueta ?vlbl ; ex : LEI ?lei ; ex : propietario ?owner .# Por último, del objeto propietario, captura el apellido: ?propietario ej .: apellido ?apellido . }

A diferencia de las bases de datos relacionales, la columna de objetos es heterogénea: el tipo de datos del objeto, si no es una URI, suele estar implícito (o especificado en la ontología ) por el valor del predicado . Los nodos literales contienen información de tipo consistente con el espacio de nombres XSD subyacente, incluyendo enteros cortos y largos con y sin signo, números de coma flotante de precisión simple y doble, fecha y hora, decimal con precisión de centavo, booleano y cadena. Las implementaciones de almacenamiento de triples en bases de datos relacionales tradicionales suelen almacenar el valor como una cadena y una cuarta columna identifica el tipo real. Las bases de datos polimórficas como MongoDB y SQLite pueden almacenar el valor nativo directamente en el campo de objeto.

Así, SPARQL proporciona un conjunto completo de operaciones de consulta analítica, como JOIN, SORT, AGGREGATEpara datos cuyo esquema forma parte intrínsecamente de los datos, en lugar de requerir una definición de esquema independiente. Sin embargo, la información del esquema (la ontología) suele proporcionarse externamente para permitir la unión inequívoca de diferentes conjuntos de datos . Además, SPARQL proporciona una sintaxis específica para el recorrido de grafos, para datos que pueden considerarse como un grafo.

El siguiente ejemplo muestra una consulta sencilla que aprovecha la definición de la ontologíafoaf ("amigo de un amigo").

En concreto, la siguiente consulta devuelve los nombres y correos electrónicos de todas las personas del 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 optó por referirse al sujeto mediante la variable " ?person". Dado que el primer elemento de la tripleta siempre es el sujeto, podría haber utilizado cualquier otra variable, como " ?subj" o " ?x". Cualquiera que sea el nombre elegido, debe ser el mismo en cada línea de la consulta para indicar que el motor de búsqueda debe unir las tripletas con el mismo sujeto.

El resultado de la unión es un conjunto de filas: ?person, ?name, ?email. Esta consulta devuelve ?namey ?emailporque ?personsuele ser una URI compleja en lugar de una cadena fácil de leer. Tenga en cuenta que cualquier ?personpuede tener varios buzones, por lo que en el conjunto devuelto, una ?namefila puede aparecer varias veces, una por cada buzón, duplicando el ?name.

Una consideración importante en SPARQL es que cuando no se cumplen las condiciones de búsqueda en la canalización para entidades terminales como ?email, entonces se excluye toda la fila , a diferencia de SQL donde normalmente se devuelve una columna nula. La consulta anterior devolverá solo aquellas donde se puedan encontrar ?personal menos uno ?namey al menos uno . Si un no tuviera correo electrónico, se excluiría. Para alinear la salida con la esperada de una consulta SQL equivalente, se requiere la palabra clave:?email?personOPTIONAL

PREFIJO foaf : <http://xmlns.com/foaf/0.1/> SELECCIONAR ?nombre ?correo electrónico DONDE { ?persona a foaf : Persona . OPCIONAL { ?persona foaf : nombre ?nombre . ?persona foaf : mbox ?correo electrónico . } }

Esta consulta se puede distribuir a múltiples puntos finales SPARQL (servicios que aceptan consultas SPARQL y devuelven resultados), se puede calcular y se pueden recopilar los resultados, un procedimiento conocido como consulta federada .

Ya sea de forma federada o local, las definiciones triples adicionales en la consulta podrían permitir uniones con diferentes tipos de temas, como automóviles, para permitir consultas sencillas, por ejemplo, para devolver una lista de nombres y correos electrónicos de personas que conducen automóviles con una alta eficiencia de combustible.

Formularios de consulta

En el caso de las consultas que leen datos de la base de datos, el lenguaje SPARQL especifica cuatro variantes de consulta diferentes para distintos propósitos.

SELECTconsulta
Se utiliza para extraer valores sin procesar de un punto final SPARQL; los resultados se devuelven en formato de tabla.
CONSTRUCTconsulta
Se utiliza para extraer información del punto final SPARQL y transformar los resultados en RDF válido.
ASKconsulta
Se utiliza para proporcionar un resultado simple de verdadero/falso para una consulta en un punto final SPARQL.
DESCRIBEconsulta
Se utiliza para extraer un grafo RDF del punto final SPARQL, cuyo contenido queda a criterio del propio punto final, en función de lo que el responsable del mantenimiento considere información útil.

Cada una de estas formas de consulta toma un WHEREbloque para restringir la consulta, aunque, en el caso de la DESCRIBEconsulta, WHEREes opcional.

SPARQL 1.1 especifica un lenguaje para actualizar la base de datos con varias formas de consulta nuevas. [ 15 ]

Ejemplo

Otro ejemplo de consulta SPARQL que modela la pregunta "¿Cuáles son todas las capitales de los países de África?":

PREFIJO ex : <http://example.com/exampleOntology#> SELECCIONAR ?capital ?país DONDE { ?x ex : nombreciudad ?capital ; ex : esCapitalDe ?y . ?y ex : nombrepaís ?país ; ex : estáEnContinente ex : África . }

Las variables se indican mediante un prefijo ?o . Se devolverán $las vinculaciones para ?capitaly . Cuando una tripleta termina con un punto y coma, el sujeto de esta tripleta completará implícitamente el par siguiente para formar una tripleta completa. Por ejemplo , es la abreviatura de .?countryex: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 de la consulta a las partes correspondientes de cada triple. Es importante destacar aquí la "orientación a las propiedades" (las coincidencias de clases se pueden realizar únicamente a través de atributos o propiedades de clase; consulte la tipificación dinámica ).

Para que las consultas sean concisas, SPARQL permite definir prefijos y URI base de forma similar a Turtle . En esta consulta, el prefijo " ex" significa http://example.com/exampleOntology#" .

SPARQL también cuenta con operaciones de fecha y hora nativas. A continuación, se muestra una consulta que devolverá todos los programas cuyo fin de vida útil (EOL) sea mayor o igual a 1000 días desde la fecha de lanzamiento y cuyo año de lanzamiento sea 2020 o posterior:

SELECCIONAR ?lbl ?versión ?lanzamiento ?fin de vida útil ?duración DONDE { ?software a ex : Software ; rdfs : etiqueta ?lbl ; ex : fin de vida útil ?fin de vida útil ; # es xsd:dateTime ex : versión ?versión ; # cadena ex : lanzado ?lanzamiento ; # es xsd:dateTime# Después de esta etapa, ?duration se vincula como tipo xsd:duration # (en implementaciones de Java, org.apache.jena.datatypes.xsd.XSDDuration) # y está disponible en la canalización, en SELECT y en # los operadores GROUP u ORDER, etc.: BIND ( ?eol - ?released AS ?duration )# La representación toString de Duration tiene el formato PnYnMnDTnHnMnS. # Debemos usar la conversión ^^ para indicarle al motor que esto debe tratarse como una duración. # La sintaxis literal de SPARQL (y RDF) tiene atajos numéricos incorporados para simplificar # expresiones sin conversiones: # 16 xsd:int java.lang.Integer # 16.7 xsd:decimal java.math.BigDecimal conserva la precisión # 16.700 xsd:decimal java.math.BigDecimal conserva la precisión # 1.0632e6 xsd:double java.lang.Double true double float; tenga cuidado # 2147483649 xsd:long java.lang.Long >32 bit int detectado automáticamente # # La mayoría de las conversiones funcionan como se espera, por ejemplo, "16.700"^^xsd:double. # Nota: en el FILTRO a continuación usamos el atajo para el entero 2020:FILTRO ( ?duración >= "P1000D" ^^ xsd : duración && AÑO ( ?publicado ) >= 2020 ) } ORDENAR POR DESC ( ?duración ) LÍMITE 5

Extensiones

GeoSPARQL define funciones de filtrado para consultas de sistemas de información geográfica (SIG) utilizando estándares OGC bien conocidos ( GML , WKT , etc.).

SPARUL es otra extensión de SPARQL. Permite actualizar el almacén RDF con este lenguaje de consulta declarativo, agregando INSERTmétodos DELETE.

XSPARQL es un lenguaje de consulta integrado que combina XQuery con SPARQL para consultar simultáneamente fuentes de datos XML y RDF. [ 16 ]

Implementaciones

Implementaciones SPARQL de código abierto y de referencia.

Consulte la Lista de implementaciones de SPARQL para obtener una cobertura más completa, que incluye almacenes de triples , API y otros sistemas de almacenamiento que han implementado el estándar SPARQL.

Véase también

Referencias

  1. 1 2 3 4 Hebeler, John; Fisher, Matthew; Blace, Ryan; Perez-Lopez, Andrew (2009). Programación de la Web Semántica . Indianápolis : John Wiley & Sons, Inc. pág. 406. ISBN  978-0-470-41801-7.
  2. Beckett, Dave (6 de octubre de 2011). "¿Qué significan las siglas SPARQL?" . semantic-web@w3.org .
  3. Jim Rapoza (2 de mayo de 2006). "SPARQL hará brillar la web" . eWeek . Consultado el 17 de enero de 2007 .
  4. Segaran, Toby; Evans, Colin; Taylor, Jamie (2009). Programación de la Web Semántica . O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. pág. 84. ISBN  978-0-596-15381-6.
  5. "Noticias sobre la actividad de la Web Semántica del W3C: SPARQL es una recomendación" . W3.org. 15 de enero de 2008. Archivado del original el 20 de enero de 2008. Consultado el 1 de octubre de 2009 .
  6. "Cronología de los estándares XML y Web Semántica del W3C" (PDF) . 4 de febrero de 2012. Archivado (PDF) del original el 8 de diciembre de 2017. Consultado el 27 de noviembre de 2013 .
  7. Herman, Ivan (21 de marzo de 2013). "Once especificaciones de SPARQL 1.1 son recomendaciones del W3C" . Blog del W3C. Archivado del original el 17 de abril de 2013. Consultado el 4 de octubre de 2025 .
  8. "SPINACH: Navegación de información basada en SPARQL para preguntas desafiantes del mundo real" . Consultado el 15 de abril de 2025 .
  9. "Servicio de consulta de Wikidata - Wikitech" . wikitech.wikimedia.org . Archivado del original el 15 de abril de 2025. Consultado el 15 de abril de 2025 .
  10. "XML y servicios web en las noticias" . xml.org . 6 de octubre de 2006. Archivado del original el 22 de mayo de 2007. Consultado el 17 de enero de 2007 .
  11. "Implementaciones de Sparql – Wiki de ESW" . Esw.w3.org. Archivado del original el 28 de septiembre de 2009. Consultado el 1 de octubre de 2009 .
  12. "ViziQuer, una herramienta para construir consultas SPARQL automáticamente" . lumii.lv. Archivado del original el 19 de abril de 2012. Recuperado el 25 de febrero de 2011 .
  13. "Servidor D2R" . Archivado del original el 26 de febrero de 2012. Consultado el 4 de febrero de 2012 .
  14. "SPARQL2XQuery Framework" . Archivado del original el 12 de mayo de 2013. Consultado el 4 de febrero de 2012 .
  15. Yu, Liyang (2014). Guía para desarrolladores sobre la Web Semántica . Springer. pág. 308. ISBN  978-3-662-43796-4.
  16. "XSPARQL publicado como una presentación al W3C" . W3.org. 23 de junio de 2009. Archivado del original el 27 de noviembre de 2022. Consultado el 22 de mayo de 2022 .
  • Servicio de consulta de Wikidata ; ejemplos de consultas SPARQL se encuentran aquí.
  • Tutorial del servicio de consultas de Wikidata
  • DBpedia
  • Blog de actividad de datos del W3C
  • Grupo de trabajo SPARQL 1.1 del W3C - cerrado - listas de correo y archivos , anteriormente Grupo de trabajo de acceso a datos RDF
  • Recomendación SPARQL 1.1
  • Lenguaje de consulta SPARQL 1.0 (heredado)
  • Protocolo SPARQL 1.0 (heredado)
  • Formato de resultados XML de consulta SPARQL 1.0 (heredado)
  • Mapeos de consultas SPARQL2X entre esquemas OWL-RDF/S y XML, y transformación de esquemas XML a OWL.
  • Expresiones de sintaxis SPARQL en el motor de consultas ARQ
  • James (8 de septiembre de 2011). "DAWG Test Suite for SPOCQ" . Dydra . Archivado del original el 7 de junio de 2015. Recuperado el 2 de diciembre de 2014 .
  • James (8 de septiembre de 2011). "Ejemplos de código RSpec / Resultados: 425 ejemplos, 1 fallo / Finalizado en 287,385157145 segundos" . Dydra . Archivado del original el 11 de diciembre de 2011. Recuperado el 2 de diciembre de 2014 .