Tutoriel wikidata

De EduTech Wiki
Aller à : navigation, rechercher

Cet article est une ébauche à compléter. Une ébauche est une entrée ayant un contenu (très) maigre et qui a donc besoin d'un auteur.

1 Introduction

«Wikidata est un projet de la Wikimedia Foundation : une base de données libre, collaborative et multilingue, qui collecte des données structurées pour alimenter Wikipédia, Wikimedia Commons, les autres projets Wikimedia et bien plus encore.» ([https://www.wikidata.org/wiki/Wikidata:Introduction/fr Wikidata:Introduction, nov 2016).

Les données structurées de Wikidata sont libres (Creative Commons Transfert dans le Domaine Public (CC0 1.0)) et multilingues. Les données incluent aussi leurs sources et des liens.

2 Schéma de données

Chaque entrée dans la base de données est appelé élément (français), item (Anglais) et Objekt (Allemamd). Autrement dit, la base de données et composé d'objets structurées que l'on appelle éléments, entrées ou items.

Chaque item a un identifieur unique (débuant avec la lettre Qqui permet de le retrouver. Par exemple:

Chaque item doit être notable (par exemple se retrouver dans une entrée d'un site de Wikimedia comme Wikipedia, Wiktionary, Wikibooks, WikiNews, etc. Chaque item doit être unique (une seule entrée / item). Ces items peuvent être reliés.

2.1 Structure des entrées

Un élément (item) est object structuré qui contient les type de composants suivantes:

  • Le libellé (Angl. label, All. Bezeichnung) définit le nom le plus connu de l'objet.
  • La description (Angl. description, All. Beschreibung) donne une définition courte d'une entrée. Cette description comprends quelques mot, ne constitue pas une phrase et suit quelques règles (minuscules, pas de ponctuation, pas d'articles, pas de phrase).
  • Les alias (All. Alternativnamen) donnent des noms alternatives aux libellés.
  • Les liens de sites incluent un URL et un titre et doivent pointer vers des pages provenant de Wikimedia. Pour chaque langue vous pouvez ajouter un lien par type de site et on peut indiquer la qualité (badge).
  • Les declarations (Angl. claims, All. Aussagen) définissent des propriétés avec une ou plusieurs valeurs. Il s'agit donc des données structurées que l'on a sur un objet.
Exemple de Educational technology:
Statements
Propriété Valeur
industry education
subclass of technology

2.2 Types de propriétés et valeurs

Les propriétés sont typées, et aussi définies par des entrées dans wikidata. Par exemple industry est définie dans l'entrée P452) avec le libellé (label) industry, la description industry of company or organization et quelques alias comme field of action ou sector.

Chaque propriété est un type de données, par exemple industry est un item. En novembre 2016, il y avait 11 types dans la liste des types de données

Finalement chaque propriété est à son tour décrite par des déclarations (statements).

Les valeurs

  • Une valeur peut être simple ou multiple

les qualificatifs

  • Les qualificatifs (Angl. qualifiers) permettent de modifier la portée d'un élément, indiquer la manière dont une valeur a été obtenue, mettre des restrictions sur la portée d'une valeur ou inclure d'autres détails nécessaires à l'interprétation de la valeur.

Les références

  • indiquent la source

Les rangs

  • Les rang (Angl. ranking) constituent une mécanique permettant d’annoter plusieurs valeurs pour une déclaration, c-a-d indiquer un statut comme preferred, normal ou deprecated

En résumé, la définition d'une propriété ressemble un peu celle des entrées et le mécanisme de stockage et d'édition est similaire:

Exemples de propriétés

Obtenir la liste de toutes les propriétés est possible avec l'API, mais un peu couteux. Il existe des listes ici:

3 Utilisation de wikidata

Actuellement, tout le monde peut consulter les entrées et on peut électroniquement accéder aux contenus

3.1 Recherche simple

3.2 Formats structurés

Toute entrée Wikidata peut être récupéré en format JSON brut ou en XML, afin de le traiter avec un script. Pour rappel, l'entrée Q1068473 concerne la technologie éducative.

Exemples utilisant des URLs simples pour sortir une entrée avec des formats différents: affichage pour humains, JSON et XML

On peut obtenir la même chose via l'API standarde (vues "human readable, JSON et XML)

Voir des explications plus détaillées sur l'API ci-dessous.

3.3 Requêtes structurées avec SPARQL

Le GUI

Le WikidataQuery Service (WDQS) permet un accès aux données Wikidata via des données. Un implémentation béta existe déjà:

Exemple pour trouver les plus grandes villes qui ont un maire femme:

#Largest cities with female mayor
#added before 2016-10
SELECT DISTINCT ?city ?cityLabel ?mayor ?mayorLabel 
WHERE 
{
	?city wdt:P31/wdt:P279* wd:Q515 .  # find instances of subclasses of city
	?city p:P6 ?statement .            # with a P6 (head of goverment) statement
	?statement ps:P6 ?mayor .          # ... that has the value ?mayor
	?mayor wdt:P21 wd:Q6581072 .       # ... where the ?mayor has P21 (sex or gender) female
	FILTER NOT EXISTS { ?statement pq:P582 ?x }  # ... but the statement has no P582 (end date) qualifier
	 
	# Now select the population value of the ?city
	# (wdt: properties use only statements of "preferred" rank if any, usually meaning "current population")
	?city wdt:P1082 ?population .
	# Optionally, find English labels for city and mayor:
	SERVICE wikibase:label {
		bd:serviceParam wikibase:language "en" .
	}
}
ORDER BY DESC(?population)
LIMIT 10

Les données peuvent être affichées en plusieurs vues, par exemple des tables, des cartes, des bubble chart, des graphes, etc.

SPARQL API

Au lieu de copier/coller les requêtes dans leur formulaire de recherche, on peut utiliser un "EndPoint" avec l'URL Suivant:

Le résultat sera retourné en XML par défaut, en JSON (format=json ), etc.

Outils externes

Le Wikidata Toolkit est une bibliothèque Java qui permet d'implémenter des applications ou encore de faire des requêtes via la ligne de commande.

3.4 Outils externes

Il existe pas mal d'outils et exemples externes que l'on peut utiliser (et parfois adapter).

4 Modules MediaWiki API

Vous pouvez expérienter avec API Sandbox et lire la API documentation

Cet API ajoute plusieurs modules à l'API de base (qui fonctionne par exemple avec ce wiki ou encore wikipedia). Les plus importants sont probablement:

  1. webgetentities. Un type de requête qui permet de récupérer des entrées et de filtrer ce qui est retourné
  2. wbsearchentities

La liste globale inclut: wbavailablebadges, wbcreateclaim, wbcreateredirect, wbeditentity, wbformatvalue, wbgetclaims, wbgetentities, wblinktitles, wbmergeitems, wbparsevalue, wbremoveclaims, wbremovequalifiers, wbremovereferences, wbsearchentities, wbsetaliases, wbsetclaim, wbsetclaimvalue, wbsetdescription, wbsetlabel, wbsetqualifier, wbsetreference, wbsetsitelink, wbsgetsuggestions

4.1 wbgetentities

action=wbgetentities&....

Ce module permet de récupérer plusieurs types d'informations. Ci-dessous nous décrivons rapidement les plus important en donnant quelques exemples.

Manuel officiel (page API): MediaWiki API help action=wbgetentities

4.1.1 Entrées via l'identificateur

ids Les entités à récupérer(entre 1 et 50 autorisés)

Exemples d'un seul ID

Plusieurs ID

Le résultat retourne une liste d'entrées. Plus précisément, l'objet JSON, a un propriété "entities" qui contient un objet dont les propriétés sont les ID (donc malheureusement pas une liste).

    "entities": {
        "Q1068473": {
            "pageid": 1017035,
             .............
          },
          "Q2020153": {
            "pageid": 1948226,
             ..............
           }
     }
    "success": 1
}

4.1.2 Liste de sites et titres Wikimedia

titles=...
sites=...

On peut indiquer une liste de titres de pages Wikimedia avec une liste de sites à chercher. Donc, il faut donner deux paramètres (un seul ne marche pas):

  1. un (ou plusieurs) nom(s) de page wikipédia (ou autre site Wikimedia)
  2. un (ou plusiers) noms de sites où chercher

et on récupère l'entrée Wikidata qui correspond.

Mais attention, on peut:

  • Indiquer un seul site pour plusieurs titres
  • Indiquer plusieurs sites pour un seul titre

Exemple: Chercher "educational technology"

... ne marche pas car il manque le site

Exemple: Chercher "educational technology" via Wikipedia Anglais avec titre normalisé

"Normaliser" veut dire transformer le nom du titre en qc. qui s'affiche plus joliment, notamment le "_" en " ".

Exemple: Chercher "educational technology" et "Academic conference" dans Wikipedia Anglais

4.1.3 Propriétés à récupérer

props=...

On peut indiquer les noms des propriétés que l'on peut obtenir. Par défaut on obtient tout, c-a-d:

info|sitelinks|aliases|labels|descriptions|claims|datatype

Exemple: Récupérer les alias de Educational technology et Academic conference

retourne une juste les alias, mais regroupés selon la langue.

Exemple: Récupérer les sites qui parlent de Piaget (variantes)

La 3ème solution donne le meilleurs résultat, le premier le moins bien.

4.1.4 Langues

languages

Par défault, le résultat contient toutes les languages. Vous choisir entre une, une liste et la liste complète (défaut). Exemple: Récupérer les alias en Anglais, Français et Allemand de l'entrée Jean Piaget

4.2 wbsearchentities

action=wbsearchentitiess&....

Ce module permet de chercher des entrées avec des libellés (labels) et des alias. Ci-dessous nous décrivons rapidement les plus important en donnant quelques exemples. Le résultat d'un query est un object qui contient des informations sur les entrées qui contiennent ce mot. Voir ci-dessous pour une exemple.

Manuel officiel (page API): MediaWiki API help action=wbsearchentities

4.2.1 Search

search

Exemple:

Ne marche pas, car il manque la langue

4.2.2 Type

type=property
type=item (default)

Identifie le type (à option). Par défaut une entrée (item), sinon peut choisir property.

4.2.3 Langue

language

Indique la langue. Ce paramètre est obligatoire.

Exemples:

La requête produit une structure comme la suivante (donnés amputées):

{
    "searchinfo": {
        "search": "Piaget"
    },
    "search": [
        {
            "id": "Q358583",
            "concepturi": "http://www.wikidata.org/entity/Q358583",
            "url": "//www.wikidata.org/wiki/Q358583",
            "title": "Q358583",
            "pageid": 342019,
            "label": "Piaget",
            "description": "Wikipedia disambiguation page",
            "match": {
                "type": "label",
                "language": "fr",
                "text": "Piaget"
            }
        },
        {
            "id": "Q658961",
            "concepturi": "http://www.wikidata.org/entity/Q658961",
            .....
         },
         ..........
        }
    ],
    "success": 1
}

4.2.4 Type de données

type

On peut chercher soit des entrées (items), soit des propriétés (properties). Permet par exemple de retrouve l'identificateur d'une propriété. Le moteur cherche le string dans les labels (libellés) et dans les alias.

Exemple: Chercher la propriété "industry" en Anglais

Cette requête donne le résultat suivant:

{
    "searchinfo": {
        "search": "industry"
    },
    "search": [
        {
            "id": "P452",
            "concepturi": "http://www.wikidata.org/entity/P452",
            "url": "//www.wikidata.org/wiki/Property:P452",
            "title": "Property:P452",
            "pageid": 12844147,
            "label": "industry",
            "description": "industry of company or organization",
            "match": {
                "type": "label",
                "language": "en",
                "text": "industry"
            }
        }
    ],
    "success": 1
}

La propriété "match" identifie la cible de la comparaison. Ci-dessus, il s'agit de "industry" (P452) qui a été retrouvé dans le "label" en Anglais.

La comparaison se fait par "string matching", donc si on cherche par exemple "ind" on retrouve toutes les entrées ou propriétés qui quelque part dans une des valeurs ont un mot qui inclut "ind". Par exemple: index, independance, etc.

Exemple: chercher la propriété pour peintre (en Anglais)

Le résultat montre que cette requête n'est pas très intélligente car il n'existe pas de propriété "painter" pour décrire des gens. Par contre il existe le propriété "creator" utilisée pour caractériser des oeuvres. Pour obtenir une liste de peintres, il faudrait plutôt chercher la catégorie de tous les peintres sur Wikipédia et les entrées qui correspondent. Sinon, il faudrait utiliser l'interface SPARQL.

Peut-on utiliser des expressions rationnelles ?

4.3 wbgetclaims

action=wbgetclaim

Manuel: https://www.wikidata.org/w/api.php?action=help&modules=wbgetclaims

Permet de récupérer directement un "mainsnak" si on connait l'entrée et la propriété.

entity

entity=

  • Définit l'entrée

property

property=

  • Filtre à option qui retourne seulement les claims qui ont un "mainsnak" avec cette propriété

props

  • Propriétés optionnelles à retourner en plus, par exemple les références.

Exemples:

5 Modèle de données

Ce chapitre donne une vue un peu plus systématique abordé dans la schéma de données.

Le Primer résume le modèle de données de la façon suivante. Il existe trois types d'entrées: les entrées (items), les propriétés et les requêtes Entity is one of the following three types of Wikibase pages, each with database content:

  1. Item, consisting of:
    1. Item identifier (number prefixed with Q)
    2. Fingerprint, consisting of:
      1. Multilingual label*
      2. Multilingual description*
      3. Multilingual aliases
    3. Statements, each consisting of:
      1. Claim, consisting of:
        1. Property
        2. Value
        3. Qualifiers (additional property-value pairs)
      2. References (each consisting of one or more property-value pairs)
      3. Rank
    4. Site links
  2. Property, consisting of
    1. Property identifier (number prefixed with P)
    2. Fingerprint, consisting of:
      1. Multilingual label*
      2. Multilingual description*
      3. Multilingual aliases
    3. Statements, each consisting of:
      1. Claim, consisting of:
        1. Property
        2. Value
        3. Qualifiers (additional property-value pairs)
      2. References (each consisting of one or more property-value pairs)
      3. Rank
    4. Datatype
  3. Query**

Le modèle de données utilisé est introduit dans Help:Wikidata datamodel. Cette page contient la figure suivante:

Data model of Wikidata. Lists id, title, type, labels, aliases, descriptions, claims and sitelinks. Data model of Wikidata. Lists mainsnak (for claims), qualifiers, references and snak.
Data model of Wikidata. Lists datavalue and possible types. Currently wikibase-entityid (item), string (including image and url), time and globecoordinate. Possible future types quantity, multilingualtext, monolingualtext.

Une version plus formelle du modèle est introduit sur le site Mediawiki.

A côté des formulations plus conceptuelles, il existe des modèles liés à une technologique particulière, dont JSON. Voici un exemple (un peu amputé !!) pour educational technology (Q1068473) d'une entrée sérialisé en JSON. Comme on l'a décrit plus haut, on peut aussi demander moins de données (donc filtrer avec props et languages par exemple).

{
    "entities": {
        "Q1068473": {
            "pageid": 1017035,
            "ns": 0,
            "title": "Q1068473",
            "lastrevid": 400333057,
            "modified": "2016-11-03T09:28:37Z",
            "type": "item",
            "id": "Q1068473",
            "labels": {
                    .............................

                "de": {
		    "language": "de",
		    "value": "Bildungstechnologie"
                },
                "fr": {
                    "language": "fr",
                    "value": "technologie \u00e9ducative"
                },
                "nl": {
                    "language": "nl",
                    "value": "onderwijstechnologie"
                }
            },
            "descriptions": {
                "en": {
                    "language": "en",
                    "value": "use of technology in education to improve learning and teaching; not restricted to high technology"
                },
                "es": {
                    "language": "es",
                    "value": "uso de la tecnolog\u00eda en la educaci\u00f3n para mejorar el aprendizaje y la ense\u00f1anza."
                },
                .....................................
                "en": [
                    {
                        "language": "en",
                        "value": "e-learning"
                    },
                    {
                        "language": "en",
                        "value": "instructional technology"
                    },
                    {
                        "language": "en",
                        "value": "information and communication technology (ICT) in education"
                    },
                    {
                        "language": "en",
                        "value": "learning technology"
                    },
                    {
                        "language": "en",
                        "value": "EdTech"
                    },
                    {
                        "language": "en",
                        "value": "multimedia learning"
                    },
                    {
                        "language": "en",
                        "value": "technology-enhanced learning (TEL)"
                    },
                    {
                        "language": "en",
                        "value": "computer-based instruction (CBI)"
                    },
                    {
                        "language": "en",
                        "value": "computer managed instruction"
                    },
                    {
                        "language": "en",
                        "value": "computer-based training (CBT)"
                    },
                    {
                        "language": "en",
                        "value": "computer-assisted instruction"
                    },
                    {
                        "language": "en",
                        "value": "computer-aided instruction (CAI)"
                    },
                    {
                        "language": "en",
                        "value": "internet-based training (IBT)"
                    },
                    {
                        "language": "en",
                        "value": "flexible learning"
                    },
                    {
                        "language": "en",
                        "value": "web-based training (WBT)"
                    },
                    {
                        "language": "en",
                        "value": "online education"
                    },
                    {
                        "language": "en",
                        "value": "virtual education"
                    },
                    {
                        "language": "en",
                        "value": "virtual learning environment (VLE)"
                    },
                    {
                        "language": "en",
                        "value": "learning platforms"
                    },
                    {
                        "language": "en",
                        "value": "m-learning"
                    },
                    {
                        "language": "en",
                        "value": "digital education"
                    },
                    {
                        "language": "en",
                        "value": "ed tech"
                    }
                ],
		"claims": {
                    "P373": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P373",
                            "datavalue": {
                                "value": "Educational technology",
                                "type": "string"
                            },
                            "datatype": "string"
                        },
                        "type": "statement",
                        "id": "q1068473$2D4F9040-0081-4299-90B7-17FAC89023D1",
                        "rank": "normal"
                    }
                ],
                "P910": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P910",
                            "datavalue": {
                                "value": {
                                    "entity-type": "item",
                                    "numeric-id": 8408260,
                                    "id": "Q8408260"
                                },
                                "type": "wikibase-entityid"
                            },
                            "datatype": "wikibase-item"
                        },
                        "type": "statement",
                        "id": "Q1068473$9D058A56-6AD6-475A-817D-5CB7B7D939C0",
                        "rank": "normal"
                    }
                ],
                "P349": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P349",
                            "datavalue": {
                                "value": "00567159",
                                "type": "string"
                            },
                            "datatype": "external-id"
                        },
                        "type": "statement",
                        "id": "Q1068473$FA7B4944-5E99-46EE-90CD-389101AE17F1",
                        "rank": "normal"
                    }
                ],
                "P279": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P279",
                            "datavalue": {
                                "value": {
                                    "entity-type": "item",
                                    "numeric-id": 11016,
                                    "id": "Q11016"
                                },
                                "type": "wikibase-entityid"
                            },
                            "datatype": "wikibase-item"
                        },
                        "type": "statement",
                        "id": "Q1068473$90358c04-4bc9-bbd3-319d-a5c3472e8406",
                        "rank": "normal"
                    }
                ],
                "P452": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P452",
                            "datavalue": {
                                "value": {
                                    "entity-type": "item",
                                    "numeric-id": 8434,
                                    "id": "Q8434"
                                },
                                "type": "wikibase-entityid"
                            },
                            "datatype": "wikibase-item"
                        },
                        "type": "statement",
                        "id": "Q1068473$92a3b12e-4de1-0258-4eeb-2b9f4e08c370",
                        "rank": "normal"
                    }
                ],
                "P2167": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P2167",
                            "datavalue": {
                                "value": "60106214",
                                "type": "string"
                            },
                            "datatype": "external-id"
                        },
                        "type": "statement",
                        "id": "Q1068473$62C2177A-F29A-4967-81EB-28BCC46351C5",
                        "rank": "normal"
                    }
                ],
                "P460": [
                    {
                        "mainsnak": {
                            "snaktype": "value",
                            "property": "P460",
                            "datavalue": {
                                "value": {
                                    "entity-type": "item",
                                    "numeric-id": 4347841,
                                    "id": "Q4347841"
                                },
                                "type": "wikibase-entityid"
                            },
                            "datatype": "wikibase-item"
                        },
                        "type": "statement",
                        "id": "Q1068473$0cbe5ab9-46a8-0720-3446-416dc524eede",
                        "rank": "normal"
                    }
                ]
            },
            "sitelinks": {
                "dewiki": {
                    "site": "dewiki",
                    "title": "Bildungstechnologie",
                    "badges": []
                },
                "enwiki": {
                    "site": "enwiki",
                    "title": "Educational technology",
                    "badges": []
                },
                "eswiki": {
                    "site": "eswiki",
                    "title": "Tecnolog\u00eda educativa",
                    "badges": []
                },
            }
        }
    },
    "success": 1
}

6 Exemples JavaScript

6.1 Récupérer une entrée dont on connaît l'identificateur et afficher qc.

A améliorer (tout le code est dans le fichier html ci-dessous)

Voici le fragment de code JQuery/JavaScript le plus important

  var wd_entry = 'Q1068473';
 // Get request with a REST URL
    $.ajax ({
        url: 'https://www.wikidata.org/w/api.php',
	type: "GET",
	data: {
	    action: 'wbgetentities',
	    format: 'json',
	    ids: wd_entry,
	    origin: "*"
	},
        dataType: 'json',
	crossDomain: true,

	// If we get data, then format these with a function. Results are spliced into the page.
        success: function(result,textStatus,jqXHR) {
            $("#results").append(doDisplay(result));
        },
        error: function(jqXHR,errortype,errormsg) {
	    console.log("HELLO");
            $("#results").append("<p>Error: " + errortype + ". Please also look at the console log. Maybe you just violoate the JavaScript onesite policy</p>");
            $("#results").append("<p>jqXHR summary:" + JSON.stringify(jqXHR) + "</p>");
            console.log(jqXHR);
            console.log(errormsg);
        }
    });

Autres exemples:

7 Liens

Documentation officielle de la technologie

La documentation officielle est relativement éparpillée dans la mesure ou les API sont autodocumentées.

Documentation officielle de Wikidata en français (qui explique surtout la structure des entrées)

La base de données officielle est sur https://www.wikidata.org/. Via cette plateforme, on peut accéder à toutes les pages help qui concerne (1) l'implémentation concrète des concepts ci-dessus et (2) les API implémentés dans ce portail.

Documentation de l'API Mediawiki

Pour s'éviter du travail inutile, il faut ensuite pas négliger de regarder les autres modules. Par exemple, wbgetclaims permet d'extraire plus facilement un claim.

Tutoriels

7.1 Wikidata query service


8 Bibliographie

  • Denny Vrandečić, Markus Krötzsch. Wikidata: A Free Collaborative Knowledgebase. In Communications of the ACM 57:10. ACM 2014. html PDF
  • Fredo Erxleben, Michael Günther, Markus Krötzsch, Julian Mendez, Denny Vrandečić. Introducing Wikidata to the Linked Data Web. In Proceedings of the 13th International Semantic Web Conference. Springer 2014. view details download