vrijdag 29 juli 2016

Alle bergen - SparQL

Op het project WikiData zijn er meerdere manieren om items op te halen.
 
WDQ, dat staat voor Wikidata Query Language, heeft een relatief simpele structuur, om bijvoorbeeld alle bergen op te zoeken voldoet claim[31:8502]. claim[31] zoekt alles waarbij P31 ingevuld is, en 8502 is het wikidata-nummer voor berg.

Met SparQL kan het ook, maar de queries zijn vaak iets ingewikkelder te begrijpen, maar je kunt er ook veel preciezere queries mee uitvoeren. En de naam zegt het al, het lijkt op SQL.

Ik had al een stuk Python code om vanuit een WDQ alle items langs te gaan, maar voor SparQL moest ik nog eens uitvogelen hoe dat in zijn werk gaat. Nou, dat bleek dus waanzinnig simpel te zijn, want onderstaande code voert dat al uit (en ja, het kan nog korter als het moet ;-)

En SparQL heeft toch wel een paar voordelen:
1) WDQ gaat (wellicht al heel snel) stoppen te bestaan
2) SparQL is veel stabieler
3) SparQL geeft vaak veel sneller resultaten
4) SparQL kan nauwkeuriger queries maken


def all_mountains():
 QUERY=u'SELECT ?item WHERE {?item wdt:P31 wd:Q8502  }'
 wikidata_site = pywikibot.Site("wikidata", "wikidata")
 generator = pg.WikidataSPARQLPageGenerator(QUERY, site=wikidata_site)

 for wd in generator:
  wd.get(get_redirect=True)
  yield wd

mygenerator=all_mountains() 
i=0 
for berg in mygenerator:
  i += 1 
  print('%s - %s' % (i,berg.title()))
  action_one_item(berg)