Logotipo animado de Wikidata ( https://commons.wikimedia.org/wiki/File:Animated_Wikidata_logo.gif )

Wikidata y el futuro de la programación

Download PDF

Wikidata forma parte del proyecto Wikipedia, en el cual colaboramos desde hace años. Hoy les hablo y explico sobre lo que es –y no es– en este breve artículo.

Como siempre nuestro enfoque es eminentemente práctico pero algo de teoría siempre es bueno. Wikidata (WD) tiene su propio artículo en Wikipedia en nuestro idioma por si quieren profundizar; yo bien resumo aquí lo que considero los aspectos importantes:

  • Hay fuertes intereses económicos tras ella, por nombrar el primero a la empresa Alphabet Inc. (si no les suena el nombre, les aclaro que es la compañía que es dueña de Google, toma castaña).
  • Hay fuertes esperanzas en que sirva a desarrollar la Inteligencia Artificial. Puede ser, no niego esa posibilidad… pero pienso más bien que (al momento de escribir estas líneas) tiene mucho de artificial y poco de inteligencia.
  • Digo que es artificial porque es una enorme base de datos del tipo NoSQL. En nuestro artículo que tradujimos explicamos los diferentes tipos de bases de datos actuales y hallo que la Wikidata es eso pero tiene un giro especial, atentos y atentas.
  • Lo que distingue a la Wikidata es la cómoda cohabitación de nos como personas y nuestras «mascotas», los robots -o bots como está de moda decirles-. Seguiremos llenando de datos la Wikipedia y en no menos de 10 años obtendremos algún avance para la consulta de la Inteligencia Artificial. Vivamos, pues el presente.
  • Existe un gran temor entre los «wikipedistas» de que la Wikidata tome control de los artículos, nada más lejos de la verdad. En una reciente encuesta realizada allá, en resumen decidimos que todo lo que tenga la ficha en Wikidata sea traído por medio de alguna plantilla al artículo correspondiente en Wikipedia. La propuesta aprobada reza exactamente lo siguiente:

Debería haber conexión automática con Wikidata en todos los parámetros posibles de la ficha. Es decir, si hay una propiedad equivalente en Wikidata a un campo de la ficha, el dato debe volcarse por defecto en Wikipedia. Al igual que en el punto anterior, cuando existan datos locales tendrá prioridad la información de Wikipedia sobre la de Wikidata. Se debería poder además negar el que un dato de Wikidata se muestre, sin necesidad de ocupar el parámetro con un dato local. Es decir, si no se considera oportuno rellenar un parámetro, que se tenga la opción de que no aparezca nada en la ficha, especificándolo en el código de la ficha de es.wiki.

Enlace web.

Aclaro los términos:

  • Un artículo en Wikipedia ya lo conocen, como humanidad llevamos siglos leyendo las enciclopedias, solo que ahora son de forma electrónica y digital.
  • Una ficha en Wikidata, siguiendo el modelo de datos, forma la unidad fundamental de una  base de datos documental. Allí podremos volcar cualquier cosa que necesitemos representar: un planeta, los seres vivos, un libro… o un artículo de Wikipedia. Prácticamente cada artículo de Wikipedia tiene una ficha en Wikidata. Vean esta página que acaba de crear alguna persona desde México, inmediatamente invita a vincular la nueva publicación ya sea con una ficha nueva o existente en Wikidata (la flecha verde la agregué yo):
B. h. asiatica (Wikipedia en castellano)
B. h. asiatica (Wikipedia en castellano)
  • Pues sí, así nace un artículo en Wikipedia, con todo y errores, yo corregí la sintaxis de plantilla para que se pudiera visualizar. 
  • Una plantilla es lo que llamamos en programación una función a la cual le pasamos los parámetros necesarios para que realice un trabajo que necesitemos. En este caso ahorra mucho tiempo porque dibuja el cuadro, agrega colores, títulos, etc. Marcando las distancias, viene a ser como HTML5 y CSS, si queremos verlo de esa manera.
  • Wikidata tiene sus propias plantillas en Wikipedia para extraer datos allá y presentarlos en el artículo. En la votación de «wikipedistas» decidimos extraer lo más que se pueda de Wikidata, pero los parámetros que agreguemos privan sobre Wikidata, en incluso de manera explícita podemos ordenar no mostrar algún dato de Wikidata, valga la redundancia.
Logotipo de Wikidata, la palabra «WIKI» en código morse ( https://commons.wikimedia.org/wiki/File:Wikidata-logo.svg )
Logotipo de Wikidata, la palabra «WIKI» en código morse ( https://commons.wikimedia.org/wiki/File:Wikidata-logo.svg )

Tabla de contenido:

Fichas o «artículos»

Modelo de dato en Wikidata ( https://commons.wikimedia.org/wiki/File:Datamodel_in_Wikidata_es.svg )
Modelo de dato en Wikidata ( https://commons.wikimedia.org/wiki/File:Datamodel_in_Wikidata_es.svg )

No los quiero agobiar, allí se los dejo… ¿Recuerdan la ficha que alguien creó desde México en la Wikipedia? Pocas horas después ya tiene su ficha en Wikidata, con el código Q27600992, si le quieren echar un ojo. Este es un ejemplo completamente nuevo y al azar que he seleccionado para una inducción a Wikidata, vamos ahora  a la médula del asunto.

Lenguaje de Consulta Estructurado

Pues que meter y meter datos, almacenar y guardar en los artículos y fichas que vimos, tenerlos solo de adorno no sirven. Debemos tener un método de consultar esos datos para convertirlos en información, para que sea útil en nuestra vida diaria o en nuestros estudios para mejorar nuestra vida diaria y conservar el planeta.

La mayoría de los sitios web tienen un cuadro de búsqueda a simple vista para que introduzcamos palabras claves y obtengamos unos resultados que son candidatos a lo que estamos buscando. Ese cuadro de búsqueda tal vez utilice el Lenguaje de Consulta Estructurado (en idioma inglés Structured Query Language o simplemente SQL). Tampoco los voy a aburrir con la larga historia de este lenguaje, solo les presento la consulta más útil y famosa de todas:

SELECT [campos] FROM [tabla] WHERE [condición]

Pausa. En el antiguo Imperio Romano la lengua franca era el idioma latín, de donde deriva nuestro castellano (a su vez todas englobadas en un concepto: Lenguas indoeuropeas). Es decir, ese imperio conquistó tantos otros imperios, reinos y naciones que impusieron su lenguaje para el comercio y tributos, así todos podían integrarse mejor, esa civilización aunque esclavizó por lo menos ofrecieron la oportunidad de integrar al imperio a quien lo quisiere.

Adelante. Hoy en día la lengua franca es el idioma inglés y las instrucciones SQL están escritas así:

  • SELECT: del verbo to select, seleccionar.
  • FROM: desde.
  • WHERE: dónde, aunque lo podemos traducir como «siempre y cuando» o «que cumpla», el castellano es largo y poético.
  • En resumen diría «selecciona los [campos] desde la [tabla] dónde esta [condición] se cumpla».
  • Al ejecutar sobre una base de datos, si consiguiera datos que cumplan con la condición, veríamos por pantalla una serie de registros representados con los campos que solicitamos.

Siempre un ejemplo con una tabla que guarda datos de personas ilustra mucho:

  • Tabla «personas»:
    • campo «cédula» (de identidad), numérico.
    • campo «nombre», cadena de caracteres.
    • campo «apellidos», cadena de caracteres.

Para retribuir una lista de personas por nombre cuya cédula este en el rango de los 17 millones:

SELECT nombres FROM personas WHERE cédula >= 17000000 AND cédula <18000000

Existen otras instrucciones en SQL para realizar mejor esta consulta pero no viene al caso, veamos ahora la Wikidata.

Lenguaje de consulta en Wikidata

Como ya entendieron el concepto de una orden de SQL (o simplemente consulta SQL) pues dejen eso allá, que el conocimiento no ocupa espacio si se guarda de manera ordenada. Tampoco es que vamos a realizar un borrón y cuenta nueva, no. Simplemente comencemos de nuevo, pendientes:

SELECT 
WHERE {
}

Arranquemos desde allí con esta estructura fundamental, pero no en una sola línea sino en varías. Nótese que lo que está entre corchetes pueden ser una o varia líneas. Grabemos en la mente ese fácil esquema.

Consultas a Wikidata

Como pueden imaginar, Wikidata ofrece una página web llamada Wikidata Query Service en la siguiente dirección web:

https://query.wikidata.org/

Allí veremos una interfaz tipo SPARQL donde escribiremos la orden vista en la sección anterior.

Campos a retribuir

Como vieron cada ficha tiene un código asociado, si visitamos www.wikidata.org y buscamos «Yaracuy», estado federal venezolano, obtendremos el código Q201121 

Estado Yaracuy en Wikidata
Estado Yaracuy en Wikidata

Pues bien, nuestra intención es conseguir los códigos de ficha que cumplan un criterio dado (ya vamos a agregar más adelante). Por ahora entonces presento a la variable ?item y la agregamos a nuestra consulta a Wikidata (o simplemente consulta):

SELECT ?item
WHERE {
}

Condición a buscar

Ahora rellenaremos lo que está entre corchetes con un triplete de elementos que forman las condiciones para Wikidata. Tomo prestado el concepto de triplete y no de trío, porque en un trío sus elementos comparte características comunes y «amigables» entre sí, la palabra triplete indica algo diferente.

Así los tripletes en Wikidata son:

  • Sujeto.
  • Propiedad.
  • Objeto.

Ahora sí develo cuál es nuestra búsqueda de ejemplo para Wikidata: los estados federales de Venezuela. Si buscamos en Wikidata haremos uso del lenguaje natural, nuestra inteligencia normal: «estados federales de Venezuela»

Búsqueda en Wikidata de los estados federales de Venezuela
Búsqueda en Wikidata de los estados federales de Venezuela
  1. La búsqueda como tal (les dejo como tarea que busquen por «estados venezolanos» a ver qué logran).
  2. El primer resultado, por casualidad, es lo que estamos buscando, tomamos nota del código: Q501094 .
  3. El tercer resultado no es que no nos interesa del todo, más bien tomen nota que ese será (o debe ser) uno de los resultados de nuestra consulta.
  4. El cuarto resultado… ¿recuerdan las plantillas de Wikipedia? Pues bien, ese es el código asignado en Wikidata para una de ellas, es una plantilla muy útil que dibuja un mapa de Venezuela y coloca sobre el mismo los enlaces a los artículos de cada estado, ¡muy bonita en verdad!
  5. El quinto resultado es un artículo en Wikipedia que agrupa los estados federales de Venezuela.

Como pueden notar, con el trabajo colaborativo, lento y constante pero sin pausa, en la Wikidata existe cantidad enorme de información por explorar. continuemos por nuestra labor, volviendo a los tripletes:

  • Sujeto: ?item (sí, lo repetimos porque es sobre quien vamos a consultar los siguientes dos elementos).
  • Propiedad: las propiedades las representaremos con el prefijo wdt: y a continuación, sin espacio alguno, el código… ¿cual código? Solo les digo que usaremos P31 y en la próxima sección lo explico; quedaría así entonces: wdt:P31 .
  • Objeto: que estamos buscando, usaremos el prefijo wd: y el código que identifica a un estado de Venezuela, osea wd:Q501094 .
  • Finalizamos la línea con un punto, nada raro en nuestro idioma.
Por favor, lea también   Wikipedia: citas, referencias y trucos

Nuestra consulta va tomando forma:

SELECT ?item
WHERE {
?item wdt:P31 wd:Q501094.
}

Eso es todo, metan esa consulta allá y debería devolver 24 resultados: ya estamos capacitados para realizar consultas a Wikidata…

🤓

¿Ah, pero quieren más? Vamos pues…

Instancia

En la consulta anterior usamos el código P31, la cual nunca olvidaremos porque engloba el concepto de instancia, pero ¿qué es una instancia?

Nivel o grado de la Administración pública o de cualquier institución política o social.

Diccionario en línea de la Real Academia Española, tercera acepción
( https://dle.rae.es/?w=instancia )

Este concepto de la vida real implica una jerarquía, pero en Wikidata eso existe pero de otra manera… Veamos esto desde el punto de vista de la informática: una clase sería, por ejemplo, casa u hogar (donde vivimos) y una instancia de esa clase sería exactamente en qué vivimos: una casa (como instancia, se repite el nombre), un apartamento, debajo de un puente… Ya me están captando lo de la Inteligencia y la Inteligencia Artificial: nosotros los humanos pensamos más rápido e incluimos muchos más conceptos.

Otro ejemplo de instancia para Wikidata: el Mar Caribe (Q1247) es una instancia (P31) de mar (Q165) y a su vez también forma parte del Océano Atlántico Norte (Q350134). Este último, aunque lleva el nombre de océano, pues también es simplemente un mar (condición wdt:P31 wd:Q165) ya que en realidad forma parte de un verdadero océano, el Atlántico (Q97).

El Océano Atlántico es una instancia de océano (Q9430) y aunque no lo crean un océano acá en el planeta Tierra forma parte de… ¡océano mundial (Q715269)!

PARE aviso de tránsito en Venezuela

Es momento entonces que nos detengamos en esto de las instancias. Pienso que este es el meollo del asunto y abren la puerta al conocimiento: cómo se interrelacionan las fichas en Wikidata. También existen diversos conceptos alternos, no necesariamente siempre usaremos «instancia de» (P31), también tenemos a  «forma parte de» (P361), «caracterizado por» (P1552) o «precedido por» (P155), en fin, las combinaciones son muchas, muchísimas.


Jerarquía

El caso más cercano al concepto de jerarquía, siempre en Wikidata, es el de subclase (P279): cuando todas las instancias de una clase son instancias de otra. Así un:

  • Un lago (Q23397) es  subclase (P279) de cuerpo de agua (Q15324).
  • Un río (Q4022) es  subclase (P279) de cuerpo de agua (Q15324).
  • Un océano (Q9430) es subclase (P279) de cuerpo de agua (Q15324).

Y acá viene algo más interesante aún: Mar Caribe (Q1247) es, indirectamente, un cuerpo de agua ya que es una instancia de mar (Q165) que a su vez es subclase de cuerpo de agua. De esta manera las consultas a Wikidata se pueden complicar más todavía pero primero sigamos aprendiendo lo básico.

Humanización de los resultados

Ya vimos que nuestra consulta:

SELECT ?item
WHERE {
?item wdt:P31 wd:Q501094.
}

funciona bien pues devuelve las fichas, sus códigos, pero eso como seres humanos dice poco, debemos sacarlo de la Inteligencia Artificial y llevarlo a un nivel más alto: los nombres de las fichas (en este caso el nombre de los estados) con la variable ?itemLabel, ya que label es etiqueta en inglés.

Para eso utilizaremos una sentencia algo larga a la cual solo debemos cambiarle un parámetro para obtener diferentes resultados… Es en este momento que ustedes me increparán «pero bueno, son los nombres de los estados ¿qué otro resultado espera vd. obtener?» Pues recuerden lo de las lenguas indoeuropeas, no son solo ellas las que existen ¿qué tal el idioma chino o el idioma japonés? Ellos y ellas también existen…

Modifiquemos pues nuestra consulta:

SELECT ?item ?itemlabel
WHERE {
?item wdt:P31 wd:Q501094. SERVICE wikibase:label { bd:serviceParam wikibase:language "es". }
}

Si queremos obtener los nombres en español usamos el código de dos letras  «es», el cual está asignado en las normas ISO al respecto. Algunos otros ejemplos serían: japonés «jp», alemán «de» y ruso «ru». Presten especial atención que la ficha debe contener la etiqueta en el idioma correspondiente, de lo contrario no obtendremos el valor necesario. Existe un parámetro que puede ser útil: [AUTO_LANGUAGE] el cual intenta colocar en el idioma que usemos una etiqueta válida. Probemos en ruso y le indicamos que si no tiene en ruso pues que ofrezca alternativa:

SELECT ?item ?itemlabel
WHERE {
?item wdt:P31 wd:Q501094. SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,[AUTO_LANGUAGE]". }
}

Añadiendo una segunda condición

Pongamos por caso que necesitamos saber cuáles son los estados de la región andina de Venezuela. Procedemos a editar nuestra consulta, para ello necesitamos como base la consulta anterior y formamos la tripleta adicional. Para no estar buscando en la página de Wikidata al «estilo Google» podemos pulsar CTRL + ESPACIO mientras modificamos nuestra consulta y escribimos las palabras claves de búsqueda.

Wikidata búsqueda de código mediante el atajo de teclado CTRL + ESPACIO
Wikidata búsqueda de código mediante el atajo de teclado CTRL + ESPACIO
  • Sujeto: ?item .
  • Propiedad: P361, «forma parte de «.
  • Objeto: Q3751548, «Región Los Andes».
SELECT ?item ?itemlabel
WHERE {
?item wdt:P31 wd:Q501094. #Que sea un estado de Venezuela ?item wdt:P361 wd:Q3751548. #Que esté en la región de Los Andes (Venezuela) SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}

Además usamos el signo numeral «#» para comentar a su derecha las instrucciones necesarias o que consideremos útiles, aunque al mover el puntero del ratón sobre los código de manera automática se muestra una descripción emergente además de sugerencias pertinentes (atentas y atentos a eso).

Nota: si la ficha no contiene la propiedad solicitada,
pues obviamente no obtendremos resultado.

Indagando una consulta ampliada

En la sección anterior solicitamos que mostrara los estados que forman parte de la Región Andina de Venezuela pero ¿qué tal si pedimos que muestre de qué forman parte los estados de Venezuela? Es decir, sí es una condición porque solamente le estamos diciendo que muestre los estados que forman parte de «algo», osea, que tengan esa propiedad y que muestre lo que contiene. Preparen y tomen café negro☕ porque acelero la explicación de manera directa:

SELECT ?item ?itemlabel ?formaparteLabel
WHERE {
?item wdt:P31 wd:Q501094. #Que sea un estado de Venezuela ?item wdt:P361 ?formaparte. #Que forme parte de algo SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}

Al momento de escribir estas líneas solo obtuve 7 resultados; tal vez necesitemos saber cuáles son todos los estados de Venezuela y además saber si forman parte de «algo»:

SELECT ?item ?itemlabel ?formaparteLabel
WHERE {
?item wdt:P31 wd:Q501094. #Que sea un estado de Venezuela OPTIONAL { ?item wdt:P361 ?formaparte. } #Que forme parte de algo SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}

En esta oportunidad obtuve 25 resultados y revisando a simple vista noto que «Dependencias Federales Venezolanas» aparece dos veces porque forma parte de «Islas de Sotavento» y además «Antillas Menores» (invito encarecidamente a que practiquen esta consulta en línea para compartir experiencias por nuestra cuenta en la red social Twitter).

Cosechando los resultados

La interfaz tiene una opción para descargar el resultado de los datos en varios formatos: HTML (la coloco a continuación), JSON ¡e incluso SVG! (entre otros formatos).

itemitemLabelformaparteLabel
http://www.wikidata.org/entity/Q170453Amazonas
http://www.wikidata.org/entity/Q190922Anzoátegui
http://www.wikidata.org/entity/Q41146Apure
http://www.wikidata.org/entity/Q190687Aragua
http://www.wikidata.org/entity/Q43271Barinas
http://www.wikidata.org/entity/Q191164Bolívar
http://www.wikidata.org/entity/Q191186Carabobo
http://www.wikidata.org/entity/Q205460Cojedes
http://www.wikidata.org/entity/Q201137Delta Amacuro
http://www.wikidata.org/entity/Q130343Dependencias Federales VenezolanasAntillas Menores
http://www.wikidata.org/entity/Q130343Dependencias Federales VenezolanasIslas de Sotavento
http://www.wikidata.org/entity/Q205843Estado La Guaira
http://www.wikidata.org/entity/Q202071Falcón
http://www.wikidata.org/entity/Q202075Guárico
http://www.wikidata.org/entity/Q205796Lara
http://www.wikidata.org/entity/Q165582MéridaRegión Los Andes
http://www.wikidata.org/entity/Q191174Miranda
http://www.wikidata.org/entity/Q205776Monagas
http://www.wikidata.org/entity/Q204876Nueva EspartaAntillas Menores
http://www.wikidata.org/entity/Q205784Portuguesa
http://www.wikidata.org/entity/Q205824Sucre
http://www.wikidata.org/entity/Q41144TáchiraRegión Los Andes
http://www.wikidata.org/entity/Q202068TrujilloRegión Los Andes
http://www.wikidata.org/entity/Q201121Yaracuy
http://www.wikidata.org/entity/Q43269ZuliaNoroeste (Venezuela)

Gráfica de los resultados

Siempre buscamos el uso práctico: solicitemos la fecha de fundación o creación de cada uno de los estados de Venezuela y pidamos una línea de tiempo (botón a la izquierda con icono con forma de ojo):

SELECT ?item ?itemlabel ?fundacion
WHERE {
?item wdt:P31 wd:Q501094. #Que sea un estado de Venezuela ?item wdt:P571 ?fundacion SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}
Gráfica de línea de tiempo con la fecha de fundación o creación de los estados de Venezuela
Gráfica de línea de tiempo con la fecha de fundación o creación de los estados de Venezuela

Mapa con ciudades de Venezuela

Aparte de la opción de graficar como de línea de tiempo, también podemos solicitar un mapa, pero va a ser que necesitamos algunas coordenadas. Cambiemos, hagamos un giro en la consulta, pidamos la fichas que:

  • Estén en Venezuela (condición).
  • Que sean ciudades (condición).
  • Que tengan un campo de coordenadas (información).
  • Recuerden siempre que deben finalizar cada línea con un punto, muy importante.
SELECT ?item ?itemlabel ?coord
WHERE {
?item wdt:P17 wd:Q717. #Que estén en Venezuela. ?item wdt:P31 wd:Q515. #Que, simplemente, sea una ciudad. ?item wdt:P625 ?coord. #Que tenga una coordenada y la pase al resultado.
SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}
Consulta a Wikidata de ciudades en Venezuela que tengan coordenadas establecidas
Consulta a Wikidata de ciudades en Venezuela que tengan coordenadas establecidas (133 resultados)

A la consulta anterior le podemos agregar que retribuya solo las ciudades que son capitales de algo (devuelve 124 resultados -al momento de escribir estas líneas- con uno que otro error de coordenadas):

?item wdt:P1376 ?capit.
Consulta a Wikidata error en coordenadas del San Diego (capital del municipio San Diego Carabobo Venezuela)
Consulta a Wikidata error en coordenadas del San Diego (capital del municipio San Diego Carabobo Venezuela)

Digamos que necesitamos enviarle a un cliente esta información, que dicho cliente (empleados y empleadas de esa empresa) lo puedan ver sin tener que solicitar la visualización del mapa, pues acá viene algo extraño: debemos agregar un comentario al final de la consulta.

Como ya imaginaron es un comentario muy especial, un comentario que puede ser leído y ejecutado por la «ventana de comando», acá lo coloco al final que me parece lo más lógico pero he visto que en también se puede colocar al principio. Recuerden que los comandos son sensibles las minúsculas y las mayúsculas, pongan mucho cuidado en escribir bien todo.

SELECT ?item ?itemlabel ?coord
WHERE {
?item wdt:P17 wd:Q717. #Que estén en Venezuela. ?item wdt:P31 wd:Q515. #Que, simplemente, sea una ciudad. ?item wdt:P625 ?coord. #Que tenga una coordenada y la pase al resultado.
?item wdt:P1376 ?capit. #Que sea una capital de algo.

SERVICE wikibase:label { bd:serviceParam wikibase:language "es,[AUTO_LANGUAGE]". }
}
#defaultView:Map

Véase también

«¿Desea usted agregar de manera fácil las referencias a Wikidata? Haga una prueba a este nuevo juego que distribuimos…»

Fuentes consultadas

<Eso es todo, por ahora>.

Download PDF