Query_Wikibase

Pour accéder à une version interactive de ce Jupyter Notebook (et au fichier .ipynb), suivre ce lien Binder. Pour plus d'infos, consulter cette page.

Interroger sa propre instance Wikibase en Python

Cette étape vise à explorer comment nous pouvons interroger / manipuler / enregistrer les données contenues dans une instance Wikibase en faisant appel à un Jupyter Notebook et aux librairies Python Requests, Pandas et SPARQLWrapper.

Objectif

Le but ici est de tester les deux façons dont nous pouvons utiliser le langage Python pour interroger la Wikibase sans devoir passer par l'interface graphique :

  • 1/ En passant par l'API MediaWiki
  • 2/ En passant par le SPARQL Endpoint

1. MediaWiki API

Cette méthode offre des possibilités plus limitées que le SPARQL endpoint (qui permet de formuler des requêtes plus complexes, après la conversion des données en RDF) et son usage est soumis à des limites*, mais les modules wbgetentities et wbsearchentities permettent toutefois d'accéder facilement au "JSON canonique des pages d'entités". Cela peut être utile par exemple si l'on souhaite obtenir toutes les informations disponibles sur une entité en particulier.

*Voir la documentation de l'API.

In [1]:
import requests
import pandas as pd

SSL_VERIFY = True
# maybe set SSL_VERIFY to False if connection to https://www.wikidata.org doesn't work (e.g. because of a proxy)
# To disable the SSL verification, remove comment sign (#) from next line
#SSL_VERIFY = False
#if not SSL_VERIFY:
#    import urllib3
#    urllib3.disable_warnings()

1.1 Obtenir les données d'entités Wikibase

Dans cet exemple, nous lançons un appel à l'API à l'aide de l'action wbgetentities afin d'obtenir toutes les données concernant Andrée de Jongh possédant l'identifiant [Q10] (https://adochs.arch.be/w/index.php?title=Item:Q10), en français. Sachez toutefois qu'il est possible d'obtenir les données de plusieurs entités à la fois (jusqu'à 50). Il est également possible de récupérer les données dans toutes les langues disponibles (il suffit de ne rien préciser).

In [2]:
get_dejongh = 'https://adochs.arch.be/w/api.php?action=wbgetentities&ids=Q10&format=json&languages=fr'
res = requests.get(get_dejongh, verify=SSL_VERIFY)
result1 = res.json()
In [3]:
print(result1)
{'entities': {'Q10': {'pageid': 13, 'ns': 120, 'title': 'Item:Q10', 'lastrevid': 4682, 'modified': '2020-05-08T15:25:16Z', 'type': 'item', 'id': 'Q10', 'labels': {'fr': {'language': 'fr', 'value': 'Andrée de Jongh'}}, 'descriptions': {'fr': {'language': 'fr', 'value': 'résistante belge'}}, 'aliases': {'fr': [{'language': 'fr', 'value': 'DEDE'}, {'language': 'fr', 'value': 'Countess Andrée de Jongh'}, {'language': 'fr', 'value': 'the Postman'}, {'language': 'fr', 'value': 'Dédée'}, {'language': 'fr', 'value': 'Comtesse Andrée de Jongh'}]}, 'claims': {'P2': [{'mainsnak': {'snaktype': 'value', 'property': 'P2', 'hash': '1e39a37398e29ca8e51667fd72bf5035feaa62f7', 'datavalue': {'value': 'Q461027', 'type': 'string'}, 'datatype': 'external-id'}, 'type': 'statement', 'id': 'Q10$86e7777d-48e3-0e41-7b43-9363dcbfd7ad', 'rank': 'normal'}], 'P47': [{'mainsnak': {'snaktype': 'value', 'property': 'P47', 'hash': '8366b12552e04447f2788e8b886f3eb456c8a3f9', 'datavalue': {'value': '0000 0000 3783 5977', 'type': 'string'}, 'datatype': 'external-id'}, 'type': 'statement', 'id': 'Q10$1c49accd-4579-fc25-6a7f-bf6c98e2e28e', 'rank': 'normal'}], 'P48': [{'mainsnak': {'snaktype': 'value', 'property': 'P48', 'hash': 'c0516fca8d78a5c2c7961e1b8b36947f70df2c9e', 'datavalue': {'value': '23987033', 'type': 'string'}, 'datatype': 'external-id'}, 'type': 'statement', 'id': 'Q10$74a0b869-46a8-a95e-07c3-12e4fc56c3e9', 'rank': 'normal'}], 'P31': [{'mainsnak': {'snaktype': 'value', 'property': 'P31', 'hash': 'b64b590f4b457f43b045c5384ef1b05c5a5ad192', 'datavalue': {'value': {'time': '+1916-11-30T00:00:00Z', 'timezone': 0, 'before': 0, 'after': 0, 'precision': 11, 'calendarmodel': 'http://www.wikidata.org/entity/Q1985727'}, 'type': 'time'}, 'datatype': 'time'}, 'type': 'statement', 'id': 'Q10$2492e61e-4038-619f-836b-19a202e41b0b', 'rank': 'normal', 'references': [{'hash': '856c433babfc78a50119682546733454e55d0c88', 'snaks': {'P60': [{'snaktype': 'value', 'property': 'P60', 'hash': '03c71c13fae081130f53160cad41493c93ecb5ee', 'datavalue': {'value': 'Q461027', 'type': 'string'}, 'datatype': 'external-id'}]}, 'snaks-order': ['P60']}]}], 'P1': [{'mainsnak': {'snaktype': 'value', 'property': 'P1', 'hash': 'c516a1ecd4748187475cb6f606b4301eb92106d4', 'datavalue': {'value': {'entity-type': 'item', 'numeric-id': 3617, 'id': 'Q3617'}, 'type': 'wikibase-entityid'}, 'datatype': 'wikibase-item'}, 'type': 'statement', 'id': 'Q10$5404acfa-4b9a-f5f9-1799-a5ae583d42bd', 'rank': 'normal'}]}, 'sitelinks': {}}}, 'success': 1}

Dataframe Pandas

Nous allons profiter de la librairie Pandas pour tenter de visualiser ces données JSON de façon peut-être plus lisible... Mais il faut se rappeler que ces données sont avant tout destinées à être lisibles par des machines : la valeur des propriétés (colonne 'claims') n'apparaît d'ailleurs pas directement dans le dataframe ci-dessous.

In [4]:
DeJongh = pd.DataFrame(result1['entities']["Q10"])
DeJongh.head() # pour voir tout l'entièreté du dataframe, supprimer le _.head()_
Out[4]:
pageid ns title lastrevid modified type id labels descriptions aliases claims sitelinks
fr 13 120 Item:Q10 4682 2020-05-08T15:25:16Z item Q10 {'language': 'fr', 'value': 'Andrée de Jongh'} {'language': 'fr', 'value': 'résistante belge'} [{'language': 'fr', 'value': 'DEDE'}, {'langua... NaN NaN
P2 13 120 Item:Q10 4682 2020-05-08T15:25:16Z item Q10 NaN NaN NaN [{'mainsnak': {'snaktype': 'value', 'property'... NaN
P47 13 120 Item:Q10 4682 2020-05-08T15:25:16Z item Q10 NaN NaN NaN [{'mainsnak': {'snaktype': 'value', 'property'... NaN
P48 13 120 Item:Q10 4682 2020-05-08T15:25:16Z item Q10 NaN NaN NaN [{'mainsnak': {'snaktype': 'value', 'property'... NaN
P31 13 120 Item:Q10 4682 2020-05-08T15:25:16Z item Q10 NaN NaN NaN [{'mainsnak': {'snaktype': 'value', 'property'... NaN

Valeur d'une propriété

Pour obtenir la valeur d'une certaine propriété (colonne claims), nous pouvons donc revenir au JSON en ciblant ce que l'on souhaite afficher (ici une date de naissance (P31) qui apparaît après datavalue) :

In [5]:
result1['entities']['Q10']['claims']['P31']
Out[5]:
[{'mainsnak': {'snaktype': 'value',
   'property': 'P31',
   'hash': 'b64b590f4b457f43b045c5384ef1b05c5a5ad192',
   'datavalue': {'value': {'time': '+1916-11-30T00:00:00Z',
     'timezone': 0,
     'before': 0,
     'after': 0,
     'precision': 11,
     'calendarmodel': 'http://www.wikidata.org/entity/Q1985727'},
    'type': 'time'},
   'datatype': 'time'},
  'type': 'statement',
  'id': 'Q10$2492e61e-4038-619f-836b-19a202e41b0b',
  'rank': 'normal',
  'references': [{'hash': '856c433babfc78a50119682546733454e55d0c88',
    'snaks': {'P60': [{'snaktype': 'value',
       'property': 'P60',
       'hash': '03c71c13fae081130f53160cad41493c93ecb5ee',
       'datavalue': {'value': 'Q461027', 'type': 'string'},
       'datatype': 'external-id'}]},
    'snaks-order': ['P60']}]}]

Parsing avancé

Comme vous pouvez le constater ci-dessus, l'extraction de valeurs associées à une propriété en particulier se révèle complexe en raison de la structure du JSON utilisée par Wikidata (voir par exemple ce post de Steve Baskauf).

En raison des spécificités du modèle de données Wikidata et de la complexité induite par les différents types de données (data-type) associées aux propriétés Wikidata - qui nécessiteraient des traitements sur mesure -, nous n'approfondissons donc pas ici le parsing de données récursives et conseillons plutôt de se référer à des outils pré-existants comme wikibase-cli (the Command-line interface interface to Wikibase instances), Wikidata Integrator exemple ou Wikidata GraphQL voir cette version de Tpt + exemples ou celle-ci (avec exemples). Il pourrait également être envisagé de passer par OpenRefine.

Extraire les données de plusieurs entités

Il est également possible de rechercher de lancer un appel à l'API pour plusieurs entités, c'est également possible.

Admettons par exemple que l'on recherche les descriptions de différentes communes belges (Q100, Q101, Q103, Q104) dans toutes les langues disponibles :

In [6]:
get_communes = 'https://adochs.arch.be/w/api.php?action=wbgetentities&ids=Q100|Q101|Q103|Q104&props=descriptions&format=json'
res = requests.get(get_communes, verify=SSL_VERIFY)
result2 = res.json()
In [7]:
print(result2)
{'entities': {'Q100': {'type': 'item', 'id': 'Q100', 'descriptions': {'fr': {'language': 'fr', 'value': "commune de la province d'Anvers (Belgique)"}, 'nl': {'language': 'nl', 'value': 'gemeente van de provincie Antwerpen (België)'}, 'de': {'language': 'de', 'value': 'Gemeinde der Provinz Antwerpen (Belgien)'}, 'en': {'language': 'en', 'value': 'municipality of the province of Antwerp (Belgium)'}}}, 'Q101': {'type': 'item', 'id': 'Q101', 'descriptions': {'fr': {'language': 'fr', 'value': "commune de la province d'Anvers (Belgique)"}, 'nl': {'language': 'nl', 'value': 'gemeente van de provincie Antwerpen (België)'}, 'de': {'language': 'de', 'value': 'Gemeinde der Provinz Antwerpen (Belgien)'}, 'en': {'language': 'en', 'value': 'municipality of the province of Antwerp (Belgium)'}}}, 'Q103': {'type': 'item', 'id': 'Q103', 'descriptions': {'fr': {'language': 'fr', 'value': "commune de la province d'Anvers (Belgique)"}, 'nl': {'language': 'nl', 'value': 'gemeente van de provincie Antwerpen (België)'}, 'de': {'language': 'de', 'value': 'Gemeinde der Provinz Antwerpen (Belgien)'}, 'en': {'language': 'en', 'value': 'municipality of the province of Antwerp (Belgium)'}}}, 'Q104': {'type': 'item', 'id': 'Q104', 'descriptions': {'fr': {'language': 'fr', 'value': "commune de la province d'Anvers (Belgique)"}, 'nl': {'language': 'nl', 'value': 'gemeente van de provincie Antwerpen (België)'}, 'de': {'language': 'de', 'value': 'Gemeinde der Provinz Antwerpen (Belgien)'}, 'en': {'language': 'en', 'value': 'municipality of the province of Antwerp (Belgium)'}}}}, 'success': 1}

1.2 Rechercher une entité

Dans cet exemple, nous lançons un appel à l'API à l'aide de l'action wbsearchentities afin de voir si la Wikibase contient une entité associée à the Postman, qui n'est autre que l'un des noms de code qui fut porté par Andrée de Jongh dans le cadre des ses activités de résistance.

Comme ce nom de code a été documenté parmi ses alias, l'entité Q10 de la Wikibase devrait normalement nous être renvoyée.

NB : il est obligatoire de préciser la langue de recherche et l'API ne semble pas utiliser de fuzzy matching, il faut donc que la même graphie soit utilisée que celle encodée dans la Wikibase.

In [8]:
find_postman = 'https://adochs.arch.be/w/api.php?action=wbsearchentities&format=json&search=the Postman&language=fr'
res = requests.get(find_postman, verify=SSL_VERIFY)
result3 = res.json()
In [9]:
result3
Out[9]:
{'searchinfo': {'search': 'the Postman'},
 'search': [{'repository': '',
   'id': 'Q10',
   'concepturi': 'https://adochs.arch.be/entity/Q10',
   'title': 'Item:Q10',
   'pageid': 13,
   'url': 'https://adochs.arch.be/wiki/Item:Q10',
   'match': {'type': 'alias', 'language': 'fr', 'text': 'the Postman'},
   'aliases': ['the Postman']}],
 'success': 1}
In [10]:
ThePostman = pd.DataFrame(result3["search"])
ThePostman.head()
Out[10]:
repository id concepturi title pageid url match aliases
0 Q10 https://adochs.arch.be/entity/Q10 Item:Q10 13 https://adochs.arch.be/wiki/Item:Q10 {'type': 'alias', 'language': 'fr', 'text': 't... [the Postman]

2. SPARQL Endpoint

Ce deuxième point est directement inspiré d'un script développé par Steve Baskauf (the Vanderbilt Libraries) ainsi que de ses posts de blogs (Getting Data Out of Wikidata using Software et, dans une moindre mesure SPARQL: Retrieving SPARQL query data using HTTP). L'idée est d'utiliser le service de requêtes de la Wikibase comme une API en tirant parti d'un script Python.

Ici nous utiliserons plus spécifiquement la librairie Pandas, a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language.

Prérequis : installer SPARQLWrapper, peut être fait via Anaconda :

coda install -c conda-forge sparqlwrapper

In [11]:
import pandas as pd
import json
from SPARQLWrapper import SPARQLWrapper, JSON

Objectif

Le but est d'extraire la liste de toutes les communes belges stockées dans la Wikibase, avec leur libellé et leur description en français, ainsi que leur identifiant AGR et leur code INS.

In [12]:
endpoint_url = "https://query-adochs.arch.be/proxy/wdqs/bigdata/namespace/wdq/sparql"
#si nous interrogions Wikidata, ça serait "https://query.wikidata.org/sparql"
In [13]:
#le code d'une requête peut être obtenue sur l'interface graphique du SPARQL endpoint en cliquant en bas à droite sur </>code 
# et en choisissant ensuite 'Python', voir l'exemple ci-dessous: https://tinyurl.com/yb22fbym

query = """
PREFIX wb: <https://adochs.arch.be/entity/>
PREFIX wbt: <https://adochs.arch.be/prop/direct/>

SELECT ?place ?placeLabel ?placeDescription ?identifiantAGR ?codeINS ?identifiantWikidata WHERE {
    ?place wbt:P1 wb:Q25. #je cherche des communes
    ?place wbt:P57 ?identifiantAGR.
  OPTIONAL { ?place wbt:P53 ?codeINS. }
  OPTIONAL { ?place wbt:P2 ?identifiantWikidata. } 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,nl" } .
}
ORDER BY xsd:integer (?identifiantAGR) """

Nous présentons en détail le processus pour récupérer les données au format JSON sous le point A/.

Nous présentons également une méthode (inspirée de cette fonction) pour stocker les données dans un dataframe Pandas (exportable en fichier CSV) sous le point B.

A/ Obtenir les données en JSON

Pour obtenir des détails sur la fonction qui suit, se référer à ce post.

In [14]:
def get_results(endpoint_url, query):
    sparql = SPARQLWrapper(endpoint_url, agent='User:Annette')
    sparql.setQuery(query)
    sparql.setReturnFormat(JSON)
    return sparql.query().convert()

results = get_results(endpoint_url, query)

#print(results)

Ci-dessous, un petit extrait de ce qu'on obtient lorsqu'on lance la commande *print(results) :

{'head': {'vars': ['place', 'placeLabel', 'placeDescription', 'identifiantAGR', 'codeINS', 'identifiantWikidata']}, 'results': {'bindings': [{'place': {'type': 'uri', 'value': 'https://adochs.arch.be/entity/Q39'}, 'identifiantAGR': {'type': 'literal', 'value': '2'}, 'codeINS': {'type': 'literal', 'value': '11002'}, 'identifiantWikidata': {'type': 'literal', 'value': 'Q12892'}, 'placeLabel': {'xml:lang': 'fr', 'type': 'literal', 'value': 'Anvers'}, 'placeDescription': {'xml:lang': 'fr', 'type': 'literal', 'value': "commune de la province d'Anvers (Belgique)"}}, {'place': {'type': 'uri', 'value': 'https://adochs.arch.be/entity/Q67'}, 'identifiantAGR': {'type': 'literal', 'value': '19'}, 'codeINS': {'type': 'literal', 'value': '11004'}, 'identifiantWikidata': {'type': 'literal', 'value': 'Q723822'}, 'placeLabel': {'xml:lang': 'fr', 'type': 'literal', 'value': 'Boechout'}, 'placeDescription': {'xml:lang': 'fr', 'type': 'literal', 'value': "commune de la province d'Anvers (Belgique)"}},

Si nous regardons le contenu de cet extrait, nous voyons qu'il s'agit d'un dictionnaire Python avec deux entrées : head et results.

  • L'entrée head contient le noms des six variables renvoyées par la requête (place, placeLabel, etc.).

  • L'entrée results contient un autre dictionnaire, contenant la clé bindings, contenant une liste des résultats en tant que tels, présents chacun dans un nouveau dictionnaire Python.

Si nous observons les premiers résultats correspondant à l'entité Anvers|Q39, nous pouvons inventorier ce que ce dictionnaire contient :

  • les 6 clés correspondants aux variables renvoyées par la requête (place, identifiantAGR, codeINS, identifiantWikidata, placeDescription)

  • pour chacune de ces 6 clés, une valeur correspondant à un autre dictionnaire (...), dont la clé value contient la valeur que nous recherchons !

L'étape suivante vise donc à parser les résultats afin de ne garder que ce qui nous intéresse.

Parser les résultats

Cette étape vise à parser la liste bindings à l'aide d'une boucle Python (for) afin d'extraire la valeur recherchée. Nous allons extraire de chaque dictionnaire de résultat (results["results"]["bindings"]) la valeur de value.

In [15]:
for result in results["results"]["bindings"]:
    place = result['place']['value']
    label = result['placeLabel']['value']
    description = result['placeDescription']['value']
    AGR = result['identifiantAGR']['value']
    INS = result['codeINS']['value']
    Wikidata = result['identifiantWikidata']['value']
    
    print(place, label, description, AGR, INS, Wikidata)
https://adochs.arch.be/entity/Q39 Anvers commune de la province d'Anvers (Belgique) 2 11002 Q12892
https://adochs.arch.be/entity/Q67 Boechout commune de la province d'Anvers (Belgique) 19 11004 Q723822
https://adochs.arch.be/entity/Q66 Boom commune de la province d'Anvers (Belgique) 22 11005 Q723972
https://adochs.arch.be/entity/Q68 Borsbeek commune de la province d'Anvers (Belgique) 23 11007 Q724055
https://adochs.arch.be/entity/Q85 Brasschaat commune de la province d'Anvers (Belgique) 24 11008 Q693513
https://adochs.arch.be/entity/Q83 Brecht commune de la province d'Anvers (Belgique) 25 11009 Q724131
https://adochs.arch.be/entity/Q75 Edegem commune de la province d'Anvers (Belgique) 29 11013 Q724238
https://adochs.arch.be/entity/Q73 Essen commune de la province d'Anvers (Belgique) 30 11016 Q724283
https://adochs.arch.be/entity/Q121 Hemiksem commune de la province d'Anvers (Belgique) 31 11018 Q724448
https://adochs.arch.be/entity/Q115 Hove commune de la province d'Anvers (Belgique) 32 11021 Q649982
https://adochs.arch.be/entity/Q77 Calmpthout commune de la province d'Anvers (Belgique) 33 11022 Q724777
https://adochs.arch.be/entity/Q84 Kapellen commune de la province d'Anvers (Belgique) 34 11023 Q724942
https://adochs.arch.be/entity/Q69 Kontich commune de la province d'Anvers (Belgique) 37 11024 Q725074
https://adochs.arch.be/entity/Q72 Lint commune de la province d'Anvers (Belgique) 40 11025 Q725268
https://adochs.arch.be/entity/Q74 Mortsel commune de la province d'Anvers (Belgique) 41 11029 Q688781
https://adochs.arch.be/entity/Q76 Niel commune de la province d'Anvers (Belgique) 42 11030 Q912054
https://adochs.arch.be/entity/Q120 Ranst commune de la province d'Anvers (Belgique) 43 11035 Q501748
https://adochs.arch.be/entity/Q114 Rumst commune de la province d'Anvers (Belgique) 48 11037 Q943446
https://adochs.arch.be/entity/Q106 Schelle commune de la province d'Anvers (Belgique) 52 11038 Q911968
https://adochs.arch.be/entity/Q104 Schilde commune de la province d'Anvers (Belgique) 53 11039 Q263177
https://adochs.arch.be/entity/Q109 Schoten commune de la province d'Anvers (Belgique) 56 11040 Q655203
https://adochs.arch.be/entity/Q110 Stabroek commune de la province d'Anvers (Belgique) 57 11044 Q595654
https://adochs.arch.be/entity/Q103 Wijnegem commune de la province d'Anvers (Belgique) 60 11050 Q527808
https://adochs.arch.be/entity/Q101 Wommelgem commune de la province d'Anvers (Belgique) 61 11052 Q839037
https://adochs.arch.be/entity/Q100 Wuustwezel commune de la province d'Anvers (Belgique) 62 11053 Q912045
https://adochs.arch.be/entity/Q97 Zandhoven commune de la province d'Anvers (Belgique) 65 11054 Q146656
https://adochs.arch.be/entity/Q86 Zoersel commune de la province d'Anvers (Belgique) 71 11055 Q218253
https://adochs.arch.be/entity/Q124 Zwijndrecht commune de la province d'Anvers (Belgique) 74 11056 Q244690
https://adochs.arch.be/entity/Q127 Malle commune de la province d'Anvers (Belgique) 77 11057 Q917591
https://adochs.arch.be/entity/Q90 Berlaar commune de la province d'Anvers (Belgique) 80 12002 Q723774
https://adochs.arch.be/entity/Q88 Bonheiden commune de la province d'Anvers (Belgique) 82 12005 Q528222
https://adochs.arch.be/entity/Q249 Bornem commune de la province d'Anvers (Belgique) 85 12007 Q724025
https://adochs.arch.be/entity/Q266 Duffel commune de la province d'Anvers (Belgique) 90 12009 Q615109
https://adochs.arch.be/entity/Q234 Heist-op-den-Berg commune de la province d'Anvers (Belgique) 91 12014 Q257979
https://adochs.arch.be/entity/Q263 Lierre commune de la province d'Anvers (Belgique) 98 12021 Q12460
https://adochs.arch.be/entity/Q248 Malines commune de la province d'Anvers (Belgique) 101 12025 Q162022
https://adochs.arch.be/entity/Q267 Nijlen commune de la province d'Anvers (Belgique) 108 12026 Q912084
https://adochs.arch.be/entity/Q264 Putte commune de la province d'Anvers (Belgique) 112 12029 Q929397
https://adochs.arch.be/entity/Q245 Puers commune de la province d'Anvers (Belgique) 115 12030 Q908546
https://adochs.arch.be/entity/Q265 Saint-Amand commune de la province d'Anvers (Belgique) 120 12034 Q912030
https://adochs.arch.be/entity/Q240 Wavre-Sainte-Catherine commune de la province d'Anvers (Belgique) 124 12035 Q696578
https://adochs.arch.be/entity/Q227 Willebroek commune de la province d'Anvers (Belgique) 127 12040 Q695278
https://adochs.arch.be/entity/Q268 Arendonk commune de la province d'Anvers (Belgique) 132 13001 Q641905
https://adochs.arch.be/entity/Q271 Baerle-Duc commune de la province d'Anvers (Belgique) 133 13002 Q244959
https://adochs.arch.be/entity/Q229 Balen commune de la province d'Anvers (Belgique) 134 13003 Q723651
https://adochs.arch.be/entity/Q287 Beerse commune de la province d'Anvers (Belgique) 137 13004 Q723728
https://adochs.arch.be/entity/Q276 Dessel commune de la province d'Anvers (Belgique) 140 13006 Q386732
https://adochs.arch.be/entity/Q269 Geel commune de la province d'Anvers (Belgique) 141 13008 Q464454
https://adochs.arch.be/entity/Q270 Grobbendonk commune de la province d'Anvers (Belgique) 147 13010 Q724389
https://adochs.arch.be/entity/Q231 Herentals commune de la province d'Anvers (Belgique) 150 13011 Q383723
https://adochs.arch.be/entity/Q275 Herenthout commune de la province d'Anvers (Belgique) 154 13012 Q724534
https://adochs.arch.be/entity/Q272 Herselt commune de la province d'Anvers (Belgique) 155 13013 Q280182
https://adochs.arch.be/entity/Q283 Hoogstraten commune de la province d'Anvers (Belgique) 158 13014 Q724638
https://adochs.arch.be/entity/Q273 Hulshout commune de la province d'Anvers (Belgique) 164 13016 Q518758
https://adochs.arch.be/entity/Q282 Kasterlee commune de la province d'Anvers (Belgique) 168 13017 Q725029
https://adochs.arch.be/entity/Q286 Lille commune de la province d'Anvers (Belgique) 172 13019 Q725235
https://adochs.arch.be/entity/Q285 Meerhout commune de la province d'Anvers (Belgique) 177 13021 Q846207
https://adochs.arch.be/entity/Q280 Merksplas commune de la province d'Anvers (Belgique) 178 13023 Q532277
https://adochs.arch.be/entity/Q279 Mol commune de la province d'Anvers (Belgique) 179 13025 Q465710
https://adochs.arch.be/entity/Q277 Olen commune de la province d'Anvers (Belgique) 181 13029 Q839044
https://adochs.arch.be/entity/Q278 Vieux-Turnhout commune de la province d'Anvers (Belgique) 182 13031 Q943555
https://adochs.arch.be/entity/Q242 Ravels commune de la province d'Anvers (Belgique) 183 13035 Q839119
https://adochs.arch.be/entity/Q247 Réthy commune de la province d'Anvers (Belgique) 187 13036 Q912062
https://adochs.arch.be/entity/Q237 Rijkevorsel commune de la province d'Anvers (Belgique) 188 13037 Q929459
https://adochs.arch.be/entity/Q274 Turnhout commune de la province d'Anvers (Belgique) 189 13040 Q271783
https://adochs.arch.be/entity/Q284 Vorselaar commune de la province d'Anvers (Belgique) 190 13044 Q909914
https://adochs.arch.be/entity/Q281 Vosselaar commune de la province d'Anvers (Belgique) 191 13046 Q929485
https://adochs.arch.be/entity/Q288 Westerlo commune de la province d'Anvers (Belgique) 192 13049 Q475931
https://adochs.arch.be/entity/Q289 Laakdal commune de la province d'Anvers (Belgique) 197 13053 Q725122
https://adochs.arch.be/entity/Q290 Anderlecht commune de Bruxelles-Capitale (Belgique) 202 21001 Q12886
https://adochs.arch.be/entity/Q291 Auderghem commune de Bruxelles-Capitale (Belgique) 203 21002 Q272228
https://adochs.arch.be/entity/Q292 Berchem-Sainte-Agathe commune de Bruxelles-Capitale (Belgique) 205 21003 Q272272
https://adochs.arch.be/entity/Q296 Bruxelles commune de Bruxelles-Capitale (Belgique) 207 21004 Q239
https://adochs.arch.be/entity/Q246 Etterbeek commune de Bruxelles-Capitale (Belgique) 211 21005 Q192859
https://adochs.arch.be/entity/Q316 Evere commune de Bruxelles-Capitale (Belgique) 212 21006 Q321718
https://adochs.arch.be/entity/Q315 Forest commune de Bruxelles-Capitale (Belgique) 213 21007 Q72946
https://adochs.arch.be/entity/Q238 Ganshoren commune de Bruxelles-Capitale (Belgique) 214 21008 Q366552
https://adochs.arch.be/entity/Q313 Ixelles commune de Bruxelles-Capitale (Belgique) 215 21009 Q208713
https://adochs.arch.be/entity/Q244 Jette commune de Bruxelles-Capitale (Belgique) 216 21010 Q241918
https://adochs.arch.be/entity/Q243 Koekelberg commune de Bruxelles-Capitale (Belgique) 217 21011 Q219244
https://adochs.arch.be/entity/Q295 Molenbeek-Saint-Jean commune de Bruxelles-Capitale (Belgique) 218 21012 Q180775
https://adochs.arch.be/entity/Q312 Saint-Gilles commune de Bruxelles-Capitale (Belgique) 219 21013 Q237674
https://adochs.arch.be/entity/Q297 Saint-Josse-ten-Noode commune de Bruxelles-Capitale (Belgique) 220 21014 Q272243
https://adochs.arch.be/entity/Q293 Schaerbeek commune de Bruxelles-Capitale (Belgique) 221 21015 Q12887
https://adochs.arch.be/entity/Q294 Uccle commune de Bruxelles-Capitale (Belgique) 222 21016 Q203312
https://adochs.arch.be/entity/Q235 Watermael-Boitsfort commune de Bruxelles-Capitale (Belgique) 223 21017 Q272262
https://adochs.arch.be/entity/Q210 Woluwe-Saint-Lambert commune de Bruxelles-Capitale (Belgique) 224 21018 Q211764
https://adochs.arch.be/entity/Q298 Woluwe-Saint-Pierre commune de Bruxelles-Capitale (Belgique) 225 21019 Q242393
https://adochs.arch.be/entity/Q311 Asse commune de la province du Brabant flamand (Belgique) 226 23002 Q515710
https://adochs.arch.be/entity/Q310 Beersel commune de la province du Brabant flamand (Belgique) 234 23003 Q692168
https://adochs.arch.be/entity/Q314 Biévène commune de la province du Brabant flamand (Belgique) 240 23009 Q839017
https://adochs.arch.be/entity/Q309 Dilbeek commune de la province du Brabant flamand (Belgique) 241 23016 Q641134
https://adochs.arch.be/entity/Q308 Gammerages commune de la province du Brabant flamand (Belgique) 248 23023 Q908554
https://adochs.arch.be/entity/Q306 Gooik commune de la province du Brabant flamand (Belgique) 252 23024 Q912014
https://adochs.arch.be/entity/Q307 Grimbergen commune de la province du Brabant flamand (Belgique) 257 23025 Q633063
https://adochs.arch.be/entity/Q3615 Hal commune de la province du Brabant flamand (Belgique) 262 23027 Q210003
https://adochs.arch.be/entity/Q239 Hérinnes commune de la province du Brabant flamand (Belgique) 266 23032 Q567808
https://adochs.arch.be/entity/Q236 Hoeilaert commune de la province du Brabant flamand (Belgique) 270 23033 Q641278
https://adochs.arch.be/entity/Q324 Kampenhout commune de la province du Brabant flamand (Belgique) 271 23038 Q492453
https://adochs.arch.be/entity/Q321 Capelle-au-Bois commune de la province du Brabant flamand (Belgique) 276 23039 Q911995
https://adochs.arch.be/entity/Q319 Liedekerke commune de la province du Brabant flamand (Belgique) 280 23044 Q818621
https://adochs.arch.be/entity/Q318 Londerzeel commune de la province du Brabant flamand (Belgique) 281 23045 Q587819
https://adochs.arch.be/entity/Q329 Machelen commune de la province du Brabant flamand (Belgique) 285 23047 Q752115
https://adochs.arch.be/entity/Q330 Meise commune de la province du Brabant flamand (Belgique) 288 23050 Q922260
https://adochs.arch.be/entity/Q331 Merchtem commune de la province du Brabant flamand (Belgique) 293 23052 Q912106
https://adochs.arch.be/entity/Q332 Opwijk commune de la province du Brabant flamand (Belgique) 297 23060 Q930292
https://adochs.arch.be/entity/Q333 Overijse commune de la province du Brabant flamand (Belgique) 300 23062 Q599127
https://adochs.arch.be/entity/Q334 Pepingen commune de la province du Brabant flamand (Belgique) 301 23064 Q646037
https://adochs.arch.be/entity/Q335 Leeuw-Saint-Pierre commune de la province du Brabant flamand (Belgique) 308 23077 Q688790
https://adochs.arch.be/entity/Q336 Steenokkerzeel commune de la province du Brabant flamand (Belgique) 314 23081 Q984888
https://adochs.arch.be/entity/Q337 Ternat commune de la province du Brabant flamand (Belgique) 318 23086 Q930249
https://adochs.arch.be/entity/Q338 Vilvorde commune de la province du Brabant flamand (Belgique) 322 23088 Q318418
https://adochs.arch.be/entity/Q339 Zaventem commune de la province du Brabant flamand (Belgique) 325 23094 Q28898
https://adochs.arch.be/entity/Q340 Zemst commune de la province du Brabant flamand (Belgique) 330 23096 Q179249
https://adochs.arch.be/entity/Q341 Roosdaal commune de la province du Brabant flamand (Belgique) 336 23097 Q936660
https://adochs.arch.be/entity/Q342 Drogenbos commune de la province du Brabant flamand (Belgique) 342 23098 Q688377
https://adochs.arch.be/entity/Q343 Kraainem commune de la province du Brabant flamand (Belgique) 343 23099 Q839023
https://adochs.arch.be/entity/Q344 Linkebeek commune de la province du Brabant flamand (Belgique) 344 23100 Q631639
https://adochs.arch.be/entity/Q345 Rhode-Saint-Genèse commune de la province du Brabant flamand (Belgique) 345 23101 Q841597
https://adochs.arch.be/entity/Q346 Wemmel commune de la province du Brabant flamand (Belgique) 346 23102 Q913195
https://adochs.arch.be/entity/Q347 Wezembeek-Oppem commune de la province du Brabant flamand (Belgique) 347 23103 Q912091
https://adochs.arch.be/entity/Q348 Lennik commune de la province du Brabant flamand (Belgique) 348 23104 Q912022
https://adochs.arch.be/entity/Q349 Affligem commune de la province du Brabant flamand (Belgique) 352 23105 Q382860
https://adochs.arch.be/entity/Q350 Aarschot commune de la province du Brabant flamand (Belgique) 356 24001 Q273442
https://adochs.arch.be/entity/Q351 Begijnendijk commune de la province du Brabant flamand (Belgique) 362 24007 Q432610
https://adochs.arch.be/entity/Q352 Bekkevoort commune de la province du Brabant flamand (Belgique) 365 24008 Q815054
https://adochs.arch.be/entity/Q353 Bertem commune de la province du Brabant flamand (Belgique) 369 24009 Q827665
https://adochs.arch.be/entity/Q354 Bierbeek commune de la province du Brabant flamand (Belgique) 373 24011 Q729929
https://adochs.arch.be/entity/Q355 Boortmeerbeek commune de la province du Brabant flamand (Belgique) 379 24014 Q746078
https://adochs.arch.be/entity/Q356 Boutersem commune de la province du Brabant flamand (Belgique) 382 24016 Q895293
https://adochs.arch.be/entity/Q357 Diest commune de la province du Brabant flamand (Belgique) 390 24020 Q743236
https://adochs.arch.be/entity/Q358 Geetbets commune de la province du Brabant flamand (Belgique) 397 24028 Q984874
https://adochs.arch.be/entity/Q359 Haacht commune de la province du Brabant flamand (Belgique) 401 24033 Q950129
https://adochs.arch.be/entity/Q360 Herent commune de la province du Brabant flamand (Belgique) 405 24038 Q930269
https://adochs.arch.be/entity/Q361 Hoegaarden commune de la province du Brabant flamand (Belgique) 409 24041 Q818787
https://adochs.arch.be/entity/Q362 Holsbeek commune de la province du Brabant flamand (Belgique) 414 24043 Q676893
https://adochs.arch.be/entity/Q363 Huldenberg commune de la province du Brabant flamand (Belgique) 419 24045 Q943472
https://adochs.arch.be/entity/Q364 Keerbergen commune de la province du Brabant flamand (Belgique) 425 24048 Q984894
https://adochs.arch.be/entity/Q365 Kortenaken commune de la province du Brabant flamand (Belgique) 426 24054 Q984877
https://adochs.arch.be/entity/Q366 Cortenbergh commune de la province du Brabant flamand (Belgique) 432 24055 Q929474
https://adochs.arch.be/entity/Q367 Landen commune de la province du Brabant flamand (Belgique) 437 24059 Q943502
https://adochs.arch.be/entity/Q368 Louvain commune de la province du Brabant flamand (Belgique) 452 24062 Q118958
https://adochs.arch.be/entity/Q369 Lubbeek commune de la province du Brabant flamand (Belgique) 458 24066 Q929447
https://adochs.arch.be/entity/Q370 Oud-Heverlee commune de la province du Brabant flamand (Belgique) 463 24086 Q746641
https://adochs.arch.be/entity/Q371 Rotselaer commune de la province du Brabant flamand (Belgique) 469 24094 Q926139
https://adochs.arch.be/entity/Q372 Tervueren commune de la province du Brabant flamand (Belgique) 473 24104 Q456544
https://adochs.arch.be/entity/Q373 Tirlemont commune de la province du Brabant flamand (Belgique) 477 24107 Q456550
https://adochs.arch.be/entity/Q374 Tremelo commune de la province du Brabant flamand (Belgique) 488 24109 Q926110
https://adochs.arch.be/entity/Q375 Léau commune de la province du Brabant flamand (Belgique) 491 24130 Q227070
https://adochs.arch.be/entity/Q376 Linter commune de la province du Brabant flamand (Belgique) 497 24133 Q984881
https://adochs.arch.be/entity/Q377 Montaigu-Zichem commune de la province du Brabant flamand (Belgique) 506 24134 Q932020
https://adochs.arch.be/entity/Q378 Tielt-Winge commune de la province du Brabant flamand (Belgique) 513 24135 Q984892
https://adochs.arch.be/entity/Q379 Glabbeek commune de la province du Brabant flamand (Belgique) 519 24137 Q984868
https://adochs.arch.be/entity/Q380 Beauvechain commune de la province du Brabant wallon (Belgique) 524 25005 Q276266
https://adochs.arch.be/entity/Q381 Braine-l'Alleud commune de la province du Brabant wallon (Belgique) 530 25014 Q497572
https://adochs.arch.be/entity/Q382 Braine-le-Château commune de la province du Brabant wallon (Belgique) 536 25015 Q497558
https://adochs.arch.be/entity/Q383 Chaumont-Gistoux commune de la province du Brabant wallon (Belgique) 539 25018 Q670141
https://adochs.arch.be/entity/Q384 Court-Saint-Étienne commune de la province du Brabant wallon (Belgique) 547 25023 Q670210
https://adochs.arch.be/entity/Q385 Genappe commune de la province du Brabant wallon (Belgique) 548 25031 Q517899
https://adochs.arch.be/entity/Q386 Grez-Doiceau commune de la province du Brabant wallon (Belgique) 558 25037 Q670310
https://adochs.arch.be/entity/Q387 Incourt commune de la province du Brabant wallon (Belgique) 564 25043 Q670455
https://adochs.arch.be/entity/Q388 Ittre commune de la province du Brabant wallon (Belgique) 570 25044 Q281080
https://adochs.arch.be/entity/Q389 Jodoigne commune de la province du Brabant wallon (Belgique) 574 25048 Q670500
https://adochs.arch.be/entity/Q390 La Hulpe commune de la province du Brabant wallon (Belgique) 585 25050 Q670407
https://adochs.arch.be/entity/Q391 Mont-Saint-Guibert commune de la province du Brabant wallon (Belgique) 586 25068 Q650152
https://adochs.arch.be/entity/Q392 Nivelles commune de la province du Brabant wallon (Belgique) 590 25072 Q319463
https://adochs.arch.be/entity/Q393 Perwez commune de la province du Brabant wallon (Belgique) 596 25084 Q678458
https://adochs.arch.be/entity/Q394 Rixensart commune de la province du Brabant wallon (Belgique) 602 25091 Q630478
https://adochs.arch.be/entity/Q395 Tubize commune de la province du Brabant wallon (Belgique) 606 25105 Q497549
https://adochs.arch.be/entity/Q396 Villers-la-Ville commune de la province du Brabant wallon (Belgique) 611 25107 Q678612
https://adochs.arch.be/entity/Q397 Waterloo commune de la province du Brabant wallon (Belgique) 617 25110 Q179034
https://adochs.arch.be/entity/Q398 Wavre commune de la province du Brabant wallon (Belgique) 618 25112 Q181314
https://adochs.arch.be/entity/Q399 Chastre commune de la province du Brabant wallon (Belgique) 622 25117 Q618054
https://adochs.arch.be/entity/Q400 Hélécine commune de la province du Brabant wallon (Belgique) 630 25118 Q670355
https://adochs.arch.be/entity/Q401 Lasne commune de la province du Brabant wallon (Belgique) 634 25119 Q678158
https://adochs.arch.be/entity/Q402 Orp-Jauche commune de la province du Brabant wallon (Belgique) 643 25120 Q678218
https://adochs.arch.be/entity/Q403 Ottignies-Louvain-la-Neuve commune de la province du Brabant wallon (Belgique) 651 25121 Q329642
https://adochs.arch.be/entity/Q404 Ramillies commune de la province du Brabant wallon (Belgique) 657 25122 Q531456
https://adochs.arch.be/entity/Q405 Rebecq commune de la province du Brabant wallon (Belgique) 669 25123 Q374861
https://adochs.arch.be/entity/Q406 Walhain commune de la province du Brabant wallon (Belgique) 673 25124 Q650216
https://adochs.arch.be/entity/Q407 Beernem commune de la province de Flandre occidentale (Belgique) 679 31003 Q687921
https://adochs.arch.be/entity/Q408 Blankenberge commune de la province de Flandre occidentale (Belgique) 683 31004 Q328104
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-15-99561e1297ab> in <module>
      5     AGR = result['identifiantAGR']['value']
      6     INS = result['codeINS']['value']
----> 7     Wikidata = result['identifiantWikidata']['value']
      8 
      9     print(place, label, description, AGR, INS, Wikidata)

KeyError: 'identifiantWikidata'

Script final A/

(Version condensée des étapes précédentes)

In [16]:
#!/usr/bin/env python3
 
from SPARQLWrapper import SPARQLWrapper, JSON
 
endpoint_url = "https://query-adochs.arch.be/proxy/wdqs/bigdata/namespace/wdq/sparql"

query = """
PREFIX wb: <https://adochs.arch.be/entity/>
PREFIX wbt: <https://adochs.arch.be/prop/direct/>

SELECT ?place ?placeLabel ?placeDescription ?identifiantAGR ?codeINS ?identifiantWikidata WHERE {
    ?place wbt:P1 wb:Q25. #je cherche des communes
    ?place wbt:P57 ?identifiantAGR.
  OPTIONAL { ?place wbt:P53 ?codeINS. }
  OPTIONAL { ?place wbt:P2 ?identifiantWikidata. } 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,nl" } .
}
ORDER BY xsd:integer (?identifiantAGR) """
 
def get_results(endpoint_url, query):
    sparql = SPARQLWrapper(endpoint_url)
    sparql.setQuery(query)
    sparql.setReturnFormat(JSON)
    return sparql.query().convert()

results = get_results(endpoint_url, query)    
 
    
for result in results["results"]["bindings"]:
    place = result['place']['value']
    label = result['placeLabel']['value']
    description = result['placeDescription']['value']
    AGR = result['identifiantAGR']['value']
    INS = result['codeINS']['value']
    Wikidata = result['identifiantWikidata']['value']
    
    print(place, label, description, AGR, INS, Wikidata)
https://adochs.arch.be/entity/Q39 Anvers commune de la province d'Anvers (Belgique) 2 11002 Q12892
https://adochs.arch.be/entity/Q67 Boechout commune de la province d'Anvers (Belgique) 19 11004 Q723822
https://adochs.arch.be/entity/Q66 Boom commune de la province d'Anvers (Belgique) 22 11005 Q723972
https://adochs.arch.be/entity/Q68 Borsbeek commune de la province d'Anvers (Belgique) 23 11007 Q724055
https://adochs.arch.be/entity/Q85 Brasschaat commune de la province d'Anvers (Belgique) 24 11008 Q693513
https://adochs.arch.be/entity/Q83 Brecht commune de la province d'Anvers (Belgique) 25 11009 Q724131
https://adochs.arch.be/entity/Q75 Edegem commune de la province d'Anvers (Belgique) 29 11013 Q724238
https://adochs.arch.be/entity/Q73 Essen commune de la province d'Anvers (Belgique) 30 11016 Q724283
https://adochs.arch.be/entity/Q121 Hemiksem commune de la province d'Anvers (Belgique) 31 11018 Q724448
https://adochs.arch.be/entity/Q115 Hove commune de la province d'Anvers (Belgique) 32 11021 Q649982
https://adochs.arch.be/entity/Q77 Calmpthout commune de la province d'Anvers (Belgique) 33 11022 Q724777
https://adochs.arch.be/entity/Q84 Kapellen commune de la province d'Anvers (Belgique) 34 11023 Q724942
https://adochs.arch.be/entity/Q69 Kontich commune de la province d'Anvers (Belgique) 37 11024 Q725074
https://adochs.arch.be/entity/Q72 Lint commune de la province d'Anvers (Belgique) 40 11025 Q725268
https://adochs.arch.be/entity/Q74 Mortsel commune de la province d'Anvers (Belgique) 41 11029 Q688781
https://adochs.arch.be/entity/Q76 Niel commune de la province d'Anvers (Belgique) 42 11030 Q912054
https://adochs.arch.be/entity/Q120 Ranst commune de la province d'Anvers (Belgique) 43 11035 Q501748
https://adochs.arch.be/entity/Q114 Rumst commune de la province d'Anvers (Belgique) 48 11037 Q943446
https://adochs.arch.be/entity/Q106 Schelle commune de la province d'Anvers (Belgique) 52 11038 Q911968
https://adochs.arch.be/entity/Q104 Schilde commune de la province d'Anvers (Belgique) 53 11039 Q263177
https://adochs.arch.be/entity/Q109 Schoten commune de la province d'Anvers (Belgique) 56 11040 Q655203
https://adochs.arch.be/entity/Q110 Stabroek commune de la province d'Anvers (Belgique) 57 11044 Q595654
https://adochs.arch.be/entity/Q103 Wijnegem commune de la province d'Anvers (Belgique) 60 11050 Q527808
https://adochs.arch.be/entity/Q101 Wommelgem commune de la province d'Anvers (Belgique) 61 11052 Q839037
https://adochs.arch.be/entity/Q100 Wuustwezel commune de la province d'Anvers (Belgique) 62 11053 Q912045
https://adochs.arch.be/entity/Q97 Zandhoven commune de la province d'Anvers (Belgique) 65 11054 Q146656
https://adochs.arch.be/entity/Q86 Zoersel commune de la province d'Anvers (Belgique) 71 11055 Q218253
https://adochs.arch.be/entity/Q124 Zwijndrecht commune de la province d'Anvers (Belgique) 74 11056 Q244690
https://adochs.arch.be/entity/Q127 Malle commune de la province d'Anvers (Belgique) 77 11057 Q917591
https://adochs.arch.be/entity/Q90 Berlaar commune de la province d'Anvers (Belgique) 80 12002 Q723774
https://adochs.arch.be/entity/Q88 Bonheiden commune de la province d'Anvers (Belgique) 82 12005 Q528222
https://adochs.arch.be/entity/Q249 Bornem commune de la province d'Anvers (Belgique) 85 12007 Q724025
https://adochs.arch.be/entity/Q266 Duffel commune de la province d'Anvers (Belgique) 90 12009 Q615109
https://adochs.arch.be/entity/Q234 Heist-op-den-Berg commune de la province d'Anvers (Belgique) 91 12014 Q257979
https://adochs.arch.be/entity/Q263 Lierre commune de la province d'Anvers (Belgique) 98 12021 Q12460
https://adochs.arch.be/entity/Q248 Malines commune de la province d'Anvers (Belgique) 101 12025 Q162022
https://adochs.arch.be/entity/Q267 Nijlen commune de la province d'Anvers (Belgique) 108 12026 Q912084
https://adochs.arch.be/entity/Q264 Putte commune de la province d'Anvers (Belgique) 112 12029 Q929397
https://adochs.arch.be/entity/Q245 Puers commune de la province d'Anvers (Belgique) 115 12030 Q908546
https://adochs.arch.be/entity/Q265 Saint-Amand commune de la province d'Anvers (Belgique) 120 12034 Q912030
https://adochs.arch.be/entity/Q240 Wavre-Sainte-Catherine commune de la province d'Anvers (Belgique) 124 12035 Q696578
https://adochs.arch.be/entity/Q227 Willebroek commune de la province d'Anvers (Belgique) 127 12040 Q695278
https://adochs.arch.be/entity/Q268 Arendonk commune de la province d'Anvers (Belgique) 132 13001 Q641905
https://adochs.arch.be/entity/Q271 Baerle-Duc commune de la province d'Anvers (Belgique) 133 13002 Q244959
https://adochs.arch.be/entity/Q229 Balen commune de la province d'Anvers (Belgique) 134 13003 Q723651
https://adochs.arch.be/entity/Q287 Beerse commune de la province d'Anvers (Belgique) 137 13004 Q723728
https://adochs.arch.be/entity/Q276 Dessel commune de la province d'Anvers (Belgique) 140 13006 Q386732
https://adochs.arch.be/entity/Q269 Geel commune de la province d'Anvers (Belgique) 141 13008 Q464454
https://adochs.arch.be/entity/Q270 Grobbendonk commune de la province d'Anvers (Belgique) 147 13010 Q724389
https://adochs.arch.be/entity/Q231 Herentals commune de la province d'Anvers (Belgique) 150 13011 Q383723
https://adochs.arch.be/entity/Q275 Herenthout commune de la province d'Anvers (Belgique) 154 13012 Q724534
https://adochs.arch.be/entity/Q272 Herselt commune de la province d'Anvers (Belgique) 155 13013 Q280182
https://adochs.arch.be/entity/Q283 Hoogstraten commune de la province d'Anvers (Belgique) 158 13014 Q724638
https://adochs.arch.be/entity/Q273 Hulshout commune de la province d'Anvers (Belgique) 164 13016 Q518758
https://adochs.arch.be/entity/Q282 Kasterlee commune de la province d'Anvers (Belgique) 168 13017 Q725029
https://adochs.arch.be/entity/Q286 Lille commune de la province d'Anvers (Belgique) 172 13019 Q725235
https://adochs.arch.be/entity/Q285 Meerhout commune de la province d'Anvers (Belgique) 177 13021 Q846207
https://adochs.arch.be/entity/Q280 Merksplas commune de la province d'Anvers (Belgique) 178 13023 Q532277
https://adochs.arch.be/entity/Q279 Mol commune de la province d'Anvers (Belgique) 179 13025 Q465710
https://adochs.arch.be/entity/Q277 Olen commune de la province d'Anvers (Belgique) 181 13029 Q839044
https://adochs.arch.be/entity/Q278 Vieux-Turnhout commune de la province d'Anvers (Belgique) 182 13031 Q943555
https://adochs.arch.be/entity/Q242 Ravels commune de la province d'Anvers (Belgique) 183 13035 Q839119
https://adochs.arch.be/entity/Q247 Réthy commune de la province d'Anvers (Belgique) 187 13036 Q912062
https://adochs.arch.be/entity/Q237 Rijkevorsel commune de la province d'Anvers (Belgique) 188 13037 Q929459
https://adochs.arch.be/entity/Q274 Turnhout commune de la province d'Anvers (Belgique) 189 13040 Q271783
https://adochs.arch.be/entity/Q284 Vorselaar commune de la province d'Anvers (Belgique) 190 13044 Q909914
https://adochs.arch.be/entity/Q281 Vosselaar commune de la province d'Anvers (Belgique) 191 13046 Q929485
https://adochs.arch.be/entity/Q288 Westerlo commune de la province d'Anvers (Belgique) 192 13049 Q475931
https://adochs.arch.be/entity/Q289 Laakdal commune de la province d'Anvers (Belgique) 197 13053 Q725122
https://adochs.arch.be/entity/Q290 Anderlecht commune de Bruxelles-Capitale (Belgique) 202 21001 Q12886
https://adochs.arch.be/entity/Q291 Auderghem commune de Bruxelles-Capitale (Belgique) 203 21002 Q272228
https://adochs.arch.be/entity/Q292 Berchem-Sainte-Agathe commune de Bruxelles-Capitale (Belgique) 205 21003 Q272272
https://adochs.arch.be/entity/Q296 Bruxelles commune de Bruxelles-Capitale (Belgique) 207 21004 Q239
https://adochs.arch.be/entity/Q246 Etterbeek commune de Bruxelles-Capitale (Belgique) 211 21005 Q192859
https://adochs.arch.be/entity/Q316 Evere commune de Bruxelles-Capitale (Belgique) 212 21006 Q321718
https://adochs.arch.be/entity/Q315 Forest commune de Bruxelles-Capitale (Belgique) 213 21007 Q72946
https://adochs.arch.be/entity/Q238 Ganshoren commune de Bruxelles-Capitale (Belgique) 214 21008 Q366552
https://adochs.arch.be/entity/Q313 Ixelles commune de Bruxelles-Capitale (Belgique) 215 21009 Q208713
https://adochs.arch.be/entity/Q244 Jette commune de Bruxelles-Capitale (Belgique) 216 21010 Q241918
https://adochs.arch.be/entity/Q243 Koekelberg commune de Bruxelles-Capitale (Belgique) 217 21011 Q219244
https://adochs.arch.be/entity/Q295 Molenbeek-Saint-Jean commune de Bruxelles-Capitale (Belgique) 218 21012 Q180775
https://adochs.arch.be/entity/Q312 Saint-Gilles commune de Bruxelles-Capitale (Belgique) 219 21013 Q237674
https://adochs.arch.be/entity/Q297 Saint-Josse-ten-Noode commune de Bruxelles-Capitale (Belgique) 220 21014 Q272243
https://adochs.arch.be/entity/Q293 Schaerbeek commune de Bruxelles-Capitale (Belgique) 221 21015 Q12887
https://adochs.arch.be/entity/Q294 Uccle commune de Bruxelles-Capitale (Belgique) 222 21016 Q203312
https://adochs.arch.be/entity/Q235 Watermael-Boitsfort commune de Bruxelles-Capitale (Belgique) 223 21017 Q272262
https://adochs.arch.be/entity/Q210 Woluwe-Saint-Lambert commune de Bruxelles-Capitale (Belgique) 224 21018 Q211764
https://adochs.arch.be/entity/Q298 Woluwe-Saint-Pierre commune de Bruxelles-Capitale (Belgique) 225 21019 Q242393
https://adochs.arch.be/entity/Q311 Asse commune de la province du Brabant flamand (Belgique) 226 23002 Q515710
https://adochs.arch.be/entity/Q310 Beersel commune de la province du Brabant flamand (Belgique) 234 23003 Q692168
https://adochs.arch.be/entity/Q314 Biévène commune de la province du Brabant flamand (Belgique) 240 23009 Q839017
https://adochs.arch.be/entity/Q309 Dilbeek commune de la province du Brabant flamand (Belgique) 241 23016 Q641134
https://adochs.arch.be/entity/Q308 Gammerages commune de la province du Brabant flamand (Belgique) 248 23023 Q908554
https://adochs.arch.be/entity/Q306 Gooik commune de la province du Brabant flamand (Belgique) 252 23024 Q912014
https://adochs.arch.be/entity/Q307 Grimbergen commune de la province du Brabant flamand (Belgique) 257 23025 Q633063
https://adochs.arch.be/entity/Q3615 Hal commune de la province du Brabant flamand (Belgique) 262 23027 Q210003
https://adochs.arch.be/entity/Q239 Hérinnes commune de la province du Brabant flamand (Belgique) 266 23032 Q567808
https://adochs.arch.be/entity/Q236 Hoeilaert commune de la province du Brabant flamand (Belgique) 270 23033 Q641278
https://adochs.arch.be/entity/Q324 Kampenhout commune de la province du Brabant flamand (Belgique) 271 23038 Q492453
https://adochs.arch.be/entity/Q321 Capelle-au-Bois commune de la province du Brabant flamand (Belgique) 276 23039 Q911995
https://adochs.arch.be/entity/Q319 Liedekerke commune de la province du Brabant flamand (Belgique) 280 23044 Q818621
https://adochs.arch.be/entity/Q318 Londerzeel commune de la province du Brabant flamand (Belgique) 281 23045 Q587819
https://adochs.arch.be/entity/Q329 Machelen commune de la province du Brabant flamand (Belgique) 285 23047 Q752115
https://adochs.arch.be/entity/Q330 Meise commune de la province du Brabant flamand (Belgique) 288 23050 Q922260
https://adochs.arch.be/entity/Q331 Merchtem commune de la province du Brabant flamand (Belgique) 293 23052 Q912106
https://adochs.arch.be/entity/Q332 Opwijk commune de la province du Brabant flamand (Belgique) 297 23060 Q930292
https://adochs.arch.be/entity/Q333 Overijse commune de la province du Brabant flamand (Belgique) 300 23062 Q599127
https://adochs.arch.be/entity/Q334 Pepingen commune de la province du Brabant flamand (Belgique) 301 23064 Q646037
https://adochs.arch.be/entity/Q335 Leeuw-Saint-Pierre commune de la province du Brabant flamand (Belgique) 308 23077 Q688790
https://adochs.arch.be/entity/Q336 Steenokkerzeel commune de la province du Brabant flamand (Belgique) 314 23081 Q984888
https://adochs.arch.be/entity/Q337 Ternat commune de la province du Brabant flamand (Belgique) 318 23086 Q930249
https://adochs.arch.be/entity/Q338 Vilvorde commune de la province du Brabant flamand (Belgique) 322 23088 Q318418
https://adochs.arch.be/entity/Q339 Zaventem commune de la province du Brabant flamand (Belgique) 325 23094 Q28898
https://adochs.arch.be/entity/Q340 Zemst commune de la province du Brabant flamand (Belgique) 330 23096 Q179249
https://adochs.arch.be/entity/Q341 Roosdaal commune de la province du Brabant flamand (Belgique) 336 23097 Q936660
https://adochs.arch.be/entity/Q342 Drogenbos commune de la province du Brabant flamand (Belgique) 342 23098 Q688377
https://adochs.arch.be/entity/Q343 Kraainem commune de la province du Brabant flamand (Belgique) 343 23099 Q839023
https://adochs.arch.be/entity/Q344 Linkebeek commune de la province du Brabant flamand (Belgique) 344 23100 Q631639
https://adochs.arch.be/entity/Q345 Rhode-Saint-Genèse commune de la province du Brabant flamand (Belgique) 345 23101 Q841597
https://adochs.arch.be/entity/Q346 Wemmel commune de la province du Brabant flamand (Belgique) 346 23102 Q913195
https://adochs.arch.be/entity/Q347 Wezembeek-Oppem commune de la province du Brabant flamand (Belgique) 347 23103 Q912091
https://adochs.arch.be/entity/Q348 Lennik commune de la province du Brabant flamand (Belgique) 348 23104 Q912022
https://adochs.arch.be/entity/Q349 Affligem commune de la province du Brabant flamand (Belgique) 352 23105 Q382860
https://adochs.arch.be/entity/Q350 Aarschot commune de la province du Brabant flamand (Belgique) 356 24001 Q273442
https://adochs.arch.be/entity/Q351 Begijnendijk commune de la province du Brabant flamand (Belgique) 362 24007 Q432610
https://adochs.arch.be/entity/Q352 Bekkevoort commune de la province du Brabant flamand (Belgique) 365 24008 Q815054
https://adochs.arch.be/entity/Q353 Bertem commune de la province du Brabant flamand (Belgique) 369 24009 Q827665
https://adochs.arch.be/entity/Q354 Bierbeek commune de la province du Brabant flamand (Belgique) 373 24011 Q729929
https://adochs.arch.be/entity/Q355 Boortmeerbeek commune de la province du Brabant flamand (Belgique) 379 24014 Q746078
https://adochs.arch.be/entity/Q356 Boutersem commune de la province du Brabant flamand (Belgique) 382 24016 Q895293
https://adochs.arch.be/entity/Q357 Diest commune de la province du Brabant flamand (Belgique) 390 24020 Q743236
https://adochs.arch.be/entity/Q358 Geetbets commune de la province du Brabant flamand (Belgique) 397 24028 Q984874
https://adochs.arch.be/entity/Q359 Haacht commune de la province du Brabant flamand (Belgique) 401 24033 Q950129
https://adochs.arch.be/entity/Q360 Herent commune de la province du Brabant flamand (Belgique) 405 24038 Q930269
https://adochs.arch.be/entity/Q361 Hoegaarden commune de la province du Brabant flamand (Belgique) 409 24041 Q818787
https://adochs.arch.be/entity/Q362 Holsbeek commune de la province du Brabant flamand (Belgique) 414 24043 Q676893
https://adochs.arch.be/entity/Q363 Huldenberg commune de la province du Brabant flamand (Belgique) 419 24045 Q943472
https://adochs.arch.be/entity/Q364 Keerbergen commune de la province du Brabant flamand (Belgique) 425 24048 Q984894
https://adochs.arch.be/entity/Q365 Kortenaken commune de la province du Brabant flamand (Belgique) 426 24054 Q984877
https://adochs.arch.be/entity/Q366 Cortenbergh commune de la province du Brabant flamand (Belgique) 432 24055 Q929474
https://adochs.arch.be/entity/Q367 Landen commune de la province du Brabant flamand (Belgique) 437 24059 Q943502
https://adochs.arch.be/entity/Q368 Louvain commune de la province du Brabant flamand (Belgique) 452 24062 Q118958
https://adochs.arch.be/entity/Q369 Lubbeek commune de la province du Brabant flamand (Belgique) 458 24066 Q929447
https://adochs.arch.be/entity/Q370 Oud-Heverlee commune de la province du Brabant flamand (Belgique) 463 24086 Q746641
https://adochs.arch.be/entity/Q371 Rotselaer commune de la province du Brabant flamand (Belgique) 469 24094 Q926139
https://adochs.arch.be/entity/Q372 Tervueren commune de la province du Brabant flamand (Belgique) 473 24104 Q456544
https://adochs.arch.be/entity/Q373 Tirlemont commune de la province du Brabant flamand (Belgique) 477 24107 Q456550
https://adochs.arch.be/entity/Q374 Tremelo commune de la province du Brabant flamand (Belgique) 488 24109 Q926110
https://adochs.arch.be/entity/Q375 Léau commune de la province du Brabant flamand (Belgique) 491 24130 Q227070
https://adochs.arch.be/entity/Q376 Linter commune de la province du Brabant flamand (Belgique) 497 24133 Q984881
https://adochs.arch.be/entity/Q377 Montaigu-Zichem commune de la province du Brabant flamand (Belgique) 506 24134 Q932020
https://adochs.arch.be/entity/Q378 Tielt-Winge commune de la province du Brabant flamand (Belgique) 513 24135 Q984892
https://adochs.arch.be/entity/Q379 Glabbeek commune de la province du Brabant flamand (Belgique) 519 24137 Q984868
https://adochs.arch.be/entity/Q380 Beauvechain commune de la province du Brabant wallon (Belgique) 524 25005 Q276266
https://adochs.arch.be/entity/Q381 Braine-l'Alleud commune de la province du Brabant wallon (Belgique) 530 25014 Q497572
https://adochs.arch.be/entity/Q382 Braine-le-Château commune de la province du Brabant wallon (Belgique) 536 25015 Q497558
https://adochs.arch.be/entity/Q383 Chaumont-Gistoux commune de la province du Brabant wallon (Belgique) 539 25018 Q670141
https://adochs.arch.be/entity/Q384 Court-Saint-Étienne commune de la province du Brabant wallon (Belgique) 547 25023 Q670210
https://adochs.arch.be/entity/Q385 Genappe commune de la province du Brabant wallon (Belgique) 548 25031 Q517899
https://adochs.arch.be/entity/Q386 Grez-Doiceau commune de la province du Brabant wallon (Belgique) 558 25037 Q670310
https://adochs.arch.be/entity/Q387 Incourt commune de la province du Brabant wallon (Belgique) 564 25043 Q670455
https://adochs.arch.be/entity/Q388 Ittre commune de la province du Brabant wallon (Belgique) 570 25044 Q281080
https://adochs.arch.be/entity/Q389 Jodoigne commune de la province du Brabant wallon (Belgique) 574 25048 Q670500
https://adochs.arch.be/entity/Q390 La Hulpe commune de la province du Brabant wallon (Belgique) 585 25050 Q670407
https://adochs.arch.be/entity/Q391 Mont-Saint-Guibert commune de la province du Brabant wallon (Belgique) 586 25068 Q650152
https://adochs.arch.be/entity/Q392 Nivelles commune de la province du Brabant wallon (Belgique) 590 25072 Q319463
https://adochs.arch.be/entity/Q393 Perwez commune de la province du Brabant wallon (Belgique) 596 25084 Q678458
https://adochs.arch.be/entity/Q394 Rixensart commune de la province du Brabant wallon (Belgique) 602 25091 Q630478
https://adochs.arch.be/entity/Q395 Tubize commune de la province du Brabant wallon (Belgique) 606 25105 Q497549
https://adochs.arch.be/entity/Q396 Villers-la-Ville commune de la province du Brabant wallon (Belgique) 611 25107 Q678612
https://adochs.arch.be/entity/Q397 Waterloo commune de la province du Brabant wallon (Belgique) 617 25110 Q179034
https://adochs.arch.be/entity/Q398 Wavre commune de la province du Brabant wallon (Belgique) 618 25112 Q181314
https://adochs.arch.be/entity/Q399 Chastre commune de la province du Brabant wallon (Belgique) 622 25117 Q618054
https://adochs.arch.be/entity/Q400 Hélécine commune de la province du Brabant wallon (Belgique) 630 25118 Q670355
https://adochs.arch.be/entity/Q401 Lasne commune de la province du Brabant wallon (Belgique) 634 25119 Q678158
https://adochs.arch.be/entity/Q402 Orp-Jauche commune de la province du Brabant wallon (Belgique) 643 25120 Q678218
https://adochs.arch.be/entity/Q403 Ottignies-Louvain-la-Neuve commune de la province du Brabant wallon (Belgique) 651 25121 Q329642
https://adochs.arch.be/entity/Q404 Ramillies commune de la province du Brabant wallon (Belgique) 657 25122 Q531456
https://adochs.arch.be/entity/Q405 Rebecq commune de la province du Brabant wallon (Belgique) 669 25123 Q374861
https://adochs.arch.be/entity/Q406 Walhain commune de la province du Brabant wallon (Belgique) 673 25124 Q650216
https://adochs.arch.be/entity/Q407 Beernem commune de la province de Flandre occidentale (Belgique) 679 31003 Q687921
https://adochs.arch.be/entity/Q408 Blankenberge commune de la province de Flandre occidentale (Belgique) 683 31004 Q328104
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-16-3ef23b6a5cf8> in <module>
     33     AGR = result['identifiantAGR']['value']
     34     INS = result['codeINS']['value']
---> 35     Wikidata = result['identifiantWikidata']['value']
     36 
     37     print(place, label, description, AGR, INS, Wikidata)

KeyError: 'identifiantWikidata'

B) Charger les résultats dans un dataframe Pandas

NB : Pour éviter les redondances, nous réutilisons les variables (endpoint_url et query, voir ci-dessus).

In [17]:
def get_sparql_dataframe(endpoint_url, query):
    """
    Helper function to convert SPARQL results into a Pandas data frame.
    """
    sparql = SPARQLWrapper(endpoint_url)
    sparql.setQuery(query)
    sparql.setReturnFormat(JSON)
    result = sparql.query()

    processed_results = json.load(result.response)
    cols = processed_results['head']['vars']

    out = []
    for row in processed_results['results']['bindings']:
        item = []
        for c in cols:
            item.append(row.get(c, {}).get('value'))
        out.append(item)

    return pd.DataFrame(out, columns=cols)
In [18]:
df_places = get_sparql_dataframe(endpoint_url, query)
df_places.head()
Out[18]:
place placeLabel placeDescription identifiantAGR codeINS identifiantWikidata
0 https://adochs.arch.be/entity/Q39 Anvers commune de la province d'Anvers (Belgique) 2 11002 Q12892
1 https://adochs.arch.be/entity/Q67 Boechout commune de la province d'Anvers (Belgique) 19 11004 Q723822
2 https://adochs.arch.be/entity/Q66 Boom commune de la province d'Anvers (Belgique) 22 11005 Q723972
3 https://adochs.arch.be/entity/Q68 Borsbeek commune de la province d'Anvers (Belgique) 23 11007 Q724055
4 https://adochs.arch.be/entity/Q85 Brasschaat commune de la province d'Anvers (Belgique) 24 11008 Q693513

Exporter les données dans un fichier CSV

In [19]:
df_places.to_csv("df_places.csv", sep = '\t', index = False, encoding = 'utf-8')

Script final B/

(Version condensée des étapes précédentes)

In [20]:
#!/usr/bin/env python3

import pandas as pd
from SPARQLWrapper import SPARQLWrapper, JSON
 
endpoint_url = "https://query-adochs.arch.be/proxy/wdqs/bigdata/namespace/wdq/sparql"

query = """
PREFIX wb: <https://adochs.arch.be/entity/>
PREFIX wbt: <https://adochs.arch.be/prop/direct/>

SELECT ?place ?placeLabel ?placeDescription ?identifiantAGR ?codeINS ?identifiantWikidata WHERE {
    ?place wbt:P1 wb:Q25. #je cherche des communes
    ?place wbt:P57 ?identifiantAGR.
  OPTIONAL { ?place wbt:P53 ?codeINS. }
  OPTIONAL { ?place wbt:P2 ?identifiantWikidata. } 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,nl" } .
}
ORDER BY xsd:integer (?identifiantAGR) """
 
def get_sparql_dataframe(endpoint_url, query):
    """
    Helper function to convert SPARQL results into a Pandas data frame.
    """
    sparql = SPARQLWrapper(endpoint_url)
    sparql.setQuery(query)
    sparql.setReturnFormat(JSON)
    result = sparql.query()

    processed_results = json.load(result.response)
    cols = processed_results['head']['vars']

    out = []
    for row in processed_results['results']['bindings']:
        item = []
        for c in cols:
            item.append(row.get(c, {}).get('value'))
        out.append(item)

    return pd.DataFrame(out, columns=cols)

df_places = get_sparql_dataframe(endpoint_url, query)

Aller plus loin

Évidemment, il est possible de lancer des requêtes plus complexes, croisant davantage d'éléments et de propriétés, par exemple dans le but de générer une heat map basée sur des données contenues dans la Wikibase ici ou encore visant à récupérer un identifiant Wikidata à partir d'un identifiant VIAF ici.

De plus, une fois que les données sont chargées dans un dataframe Pandas, il est possible d'en profiter pour faire d'autres choses, comme par exemple compter le nombre de personnes partageant la même description ici, ré-ordonner l'ordre des éléments, combiner des colonnes, etc. ici, .