De Getty Thesaurus of Geographic Names (TGN) is onlangs als open data beschikbaar gekomen. Daarmee heeft nu iedereen de mogelijkheid geografische namen met deze thesaurus te standaardiseren. En om open collecties die deze thesaurus gebruiken op een eenduidige manier te bevragen.

De TGN is niet via een eenvoudige json uitleverende api onsloten – wel jammer voor een eenvoudige ontwikkelaar als ik zelf -, maar netjes als Linked Open Data gepubliceerd.

Dat wordt sparqlen dus.

Omdat ik eerst wil kijken welke NL data de TGN bevat, begin ik met het ophalen van een provincie.

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX tgn: <http://vocab.getty.edu/tgn/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX gvp: <http://vocab.getty.edu/ontology#>
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
select ?place ?name ?lat ?long {
 ?place skos:inScheme tgn: ;
 foaf:focus [wgs:lat ?lat; wgs:long ?long];
 gvp:prefLabelGVP [xl:literalForm ?name];
 gvp:parentString "Noord-Holland, Nederland, Europe, World"
 }

De 1270 Noord-Hollandse ‘plaatsen’ die de query oplevert kunnen ook als json en xml gedownload worden. Fijn, want dan kan je er zelf verder mee aan de gang.

Nu heb ik alle ‘plaatsen’ binnen Noord-Holland (de queries voor andere provincies kan je wel verzinnen), met TGN uri, naam, breedtegraad en lengtegraad. Maar het type plaats zou ook handig zijn, want ik zie er behalve ‘populated places’ ook meren, kanalen, polders, natuurgebieden, stations en zelfs hoeves tussen staan.

Hoe het type plaats op te vragen? Eerst maar eens alle kenmerken van één plaats (Haarlem, in dit geval) opvragen, om te zien hoe het ‘type’ wordt genoemd:

PREFIX tgn: <http://vocab.getty.edu/tgn/>
select ?p ?o {
 tgn:7007048 ?p ?o
 }

Aha, het blijkt om gvp:placeType (de ‘afkorting’ van http://vocab.getty.edu/ontology#placeType) te gaan. In het geval van Haarlem zie ik vier waardes staan – allemaal uri’s als http://vocab.getty.edu/aat/300008347. LOD steekt heel doordacht in elkaar, maar nu weten we natuurlijk nog niets.

Als je de uri volgt zie je dat het om Inhabited Places gaat, en daar vind je ook het Nederlandse prefLabel Bewoonde gebieden en het altLabel Nederzetting. Eens kijken of we er een lijst met alle placeTypes uit kunnen krijgen.

PREFIX gvp: <http://vocab.getty.edu/ontology#>
PREFIX skosxl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX gvp_lang: <http://vocab.getty.edu/language/>
select ?type ?label (count(*) as ?c) {
 ?s gvp:placeTypePreferred ?type .
 ?type gvp:prefLabelGVP [xl:literalForm ?label]
} group by ?type ?label order by ?label

Mooier is het om ook de Nederlandse labels er meteen bij te hebben. Met dank aan @valexiev1, die me onderstaande query tweette.

PREFIX gvp: <http://vocab.getty.edu/ontology#>
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX gvp_lang: <http://vocab.getty.edu/language/>
select ?type ?en ?nl (count(*) as ?c) {
 ?s gvp:placeTypePreferred ?type .
 ?type xl:prefLabel [xl:literalForm ?en; dct:language gvp_lang:en].
 optional {?type xl:prefLabel [xl:literalForm ?nl; dct:language gvp_lang:nl]}
} group by ?type ?en ?nl order by ?label

Enfin, nu de query maken die alle plaatsen in Noord-Holland geeft, en ditmaal voorzien van het type plaats:

PREFIX aat: <http://vocab.getty.edu/aat/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX gvp: <http://vocab.getty.edu/ontology#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX tgn: <http://vocab.getty.edu/tgn/>
PREFIX wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
select ?place ?name ?lat ?long ?typeURI ?typeLabel {
  ?place skos:inScheme tgn: ;
    foaf:focus [wgs:lat ?lat; wgs:long ?long];
    gvp:prefLabelGVP [xl:literalForm ?name];
    gvp:placeType ?typeURI;
    gvp:placeType [skos:prefLabel ?typeLabel];
    gvp:parentString "Noord-Holland, Nederland, Europe, World"
         FILTER( lang(?typeLabel) = "en")
  }

En daar heb je de hele provincie voorzien van het type van elke plaats. Houd er rekening mee dat plaatsen nu meerdere keren voor kunnen komen in de lijst (het zijn er nu 1354), omdat één plaats meerdere types kan hebben. Amstelveen is een city, een inhabited place en een suburb bovendien!

Het blijft kortom een beetje jammer dat er geen api is die json geeft, waarin de kenmerken van elk element ook een array kunnen bevatten. Maar dat is waarschijnlijk te makkelijk gedacht.