Herramienta de línea de comandos para consultar Wikidata (u otro punto final de SPARQL)

En la terminal de Linux, quiero ejecutar una consulta SPARQL y obtener como salida el resultado como CSV:

$ query --service https://query.wikidata.org/sparql?query=SPARQL --sparql "SELECT ?i ?c WHERE { ?i wdt:P31 wd:Q3917681. ?i wdt:P137 ?c.}"
wd:Q4374016,wd:Q819
wd:Q4374028,wd:Q711
wd:Q4374063,wd:Q874
wd:Q4374039,wd:Q159

... o algo similar.

Requisitos:

  • Gratis, de código abierto
  • Funciona con Wikidata
  • Funciona en Linux
  • Bonificación si puede manejar los prefijos de espacio de nombres habituales sin tener que especificarlos en la línea de comando.
  • Tener que escribir la solicitud en un archivo de texto también es aceptable

Respuestas (4)

Para la mayoría de las aplicaciones, el enfoque básico de línea de comandos es suficiente. Dada la consulta en un archivo query.sparql, obtenga CSV con curl:

curl -X POST https://query.wikidata.org/sparql -H "Accept: text/csv" --data-urlencode query@query.sparql

Aquí hay otro script bash que también admite la salida JSON, por ejemplo, para procesar con jq:

#!/bin/bash
#
# Run a Wikidata query from command line
# 
# Usage examples:
#
#   wdquery "DESCRIBE wd:Q42"
#   wdquery - xml < query.sparql
#   wdquery query.sparql json
#

QUERY=${1--}        # SPARQL query or file
FORMAT=${2-json}    # output format

ENDPOINT=https://query.wikidata.org/sparql

# make sure query is written to a file
if ! [ -f "$QUERY" ]
then
    TMPFILE="$(mktemp)"
    if [ "$QUERY" == "-" ]
    then
        # read query from STDIN
        cat > "$TMPFILE"
    else
        # write query to file
        echo "$QUERY" > "$TMPFILE"
    fi
    QUERY="$TMPFILE"
fi

curl -s -X GET -F "query=@$QUERY" "$ENDPOINT?format=$FORMAT"

[ -z "$TMPFILE" ] || rm "$TMPFILE"

Escribí este script bash para permitir consultas fáciles de Wikidata desde la línea de comandos.

Uso:

./query-wikidata.sh "SELECT DISTINCT ?item WHERE {?item wdt:P31 wd:Q3917681. ?item wdt:P137 wd:Q16. ?item wdt:P131*/wdt:P17 wd:Q142.}"

O esta sintaxis más legible:

echo "
 SELECT DISTINCT
   ?item
 WHERE {
   ?item wdt:P31 wd:Q3917681.
   ?item wdt:P137 wd:Q16.
   ?item wdt:P131*/wdt:P17 wd:Q142.
 }
 " |./query-wikidata.sh

Producción:

<?xml version='1.0' encoding='UTF-8'?>
<sparql xmlns='http://www.w3.org/2005/sparql-results#'>
        <head>
                <variable name='item'/>
        </head>
        <results>
                <result>
                        <binding name='item'>
                                <uri>http://www.wikidata.org/entity/Q137798</uri>
                        </binding>
                </result>
        </results>
</sparql>

Además de alguna información de red sobre la salida de errores.

Conoce los prefijos estándar de Wikidata.
Licencia: GNU-GPLv3

el enlace al script está roto a partir del 2022-02-12
@wolfgang fahl: Arreglado, ¡gracias por avisarme!

No reconoce los prefijos de Wikidata de forma predeterminada y no puede generar CSV en este momento, pero la consola RDF4J es una aplicación de línea de comandos genérica útil, no solo para hablar con Wikidata, sino con cualquier punto final público de SPARQL, su propio servidor RDF4J, o incluso un triplestore incrustado simple propio.

Para instalar, necesita un entorno de ejecución Java (8). Luego, simplemente descargue el SDK de RDF4J . El console.shscript se puede encontrar en el bin/directorio.

Para consultar Wikidata, inicie la consola y agregue una nueva definición de punto final SPARQL:

./console.sh 
Connected to default data directory
RDF4J Console 2.0.1
Type 'help' for help.
> create sparql
Please specify values for the following variables:
SPARQL query endpoint: https://query.wikidata.org/sparql
SPARQL update endpoint: 
Local repository ID [endpoint@localhost]: wikidata
Repository title [SPARQL endpoint repository @localhost]: wikidata sparql endpoint
Repository created

Una vez que esté configurado, puede abrir el repositorio creado (que es solo un proxy para el punto final público de SPARQL):

> open wikidata
Opened repository 'wikidata'

Luego solo consulta (teniendo cuidado de no sobrecargar el punto final; usa limitcláusulas si estás experimentando):

wikidata> select * where {?x rdf:type ?o } limit 10
Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| x                                   | o                                   |
+-------------------------------------+-------------------------------------+
| <http://wikiba.se/ontology#Dump>    | <http://schema.org/Dataset>         |
| <http://www.wikidata.org/value/8000b1b66dfb1c74420cf59f0388d425>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/8000d3ac475ff41c5e2e38ffda574d1c>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/8000f71177f50273969eca2096803e29>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/80018edb4bf3ecf344a2d4343d76235c>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/800269618da5a8571140652500ade834>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/8003743c7dbef48511f9df4e629fd462>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/8003a8ceaf4f75884d2b9ff99e3c959c>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/80062f03a3a91733e0eb81f50ca56208>| <http://wikiba.se/ontology#GeoAutoPrecision>|
| <http://www.wikidata.org/value/800682cb1e9157517ed01b1a4b1760bc>| <http://wikiba.se/ontology#GeoAutoPrecision>|
+-------------------------------------+-------------------------------------+
10 result(s) (1231 ms)

Todo lo anterior se hace de forma interactiva, pero, por supuesto, puede escribir estos comandos y luego introducirlos en el console.shshellscript.

FWIW, la especificación del formato de salida está en la lista de tareas pendientes , al igual que la definición personalizada de espacios de nombres .

En cuanto a sus requisitos, punto por punto:

  • RDF4J es de código abierto ( licencia EDL )
  • Funciona con Wikidata o cualquier otro endpoint SPARQL
  • Funciona en Linux o cualquier otro sistema operativo (Java)
  • No admite (todavía) el manejo de prefijos de espacios de nombres sin tener que especificarlos (al menos no para puntos finales SPARQL)
  • No es necesario que escriba la solicitud en un archivo de texto, pero puede hacerlo si lo desea.

Hay una herramienta de línea de comandos basada en Perl wdqdesde 2016, en Github y en CPAN .

con una consulta

wdq -tplanet '?planet wdt:P31 wd:Q44559; wdt:P397 ?sun' > stars-and-exoplanets.json

obtendrá un conjunto de resultados JSON.

No tendrá que especificar prefijos de espacio de nombres y wdqtambién inyecta el servicio de etiqueta en la consulta SPARQL. Lea la publicación en OpenData.SE del usuario Jakob .

Puede transformar JSON a CSV con jq.

< stars-and-exoplanets.json jq -r    \
'. | map({"p":.planet, "pl":.planetLabel,  "pd":.planetDescription, "sun":.sun})'  \
 | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' \
> stars-and-exoplanets.csv

JSON:

# < stars-and-exoplanets.json jq  '.[0]'
# first record of ~3000
{
  "planet": "http://www.wikidata.org/entity/Q1198042",
  "planetDescription": "extrasolar planet",
  "planetLabel": "HD 37124 d",
  "sun": "http://www.wikidata.org/entity/Q139390"
}

CSV (primeras 2 líneas):

# < sun-and-stars-and-exoplanets.csv head -2

"p","pd","pl","sun"
"http://www.wikidata.org/entity/Q1198042","extrasolar planet","HD 37124 d","http://www.wikidata.org/entity/Q139390"