# Programmeren in SPARQL
## Links

* SPARQL-uitleg in het Engels op Wikidata

## Queries uitvoeren

Om een SparQL query uit te voeren, kun je de query invoeren in: https://query.wikidata.org/

## Zoek naar een bepaalde constante waarde

Zoek alle items die voor eigenschap P850 de waarde 744368 hebben:

## Zoek naar een bepaalde verwijzing

Door de toevoeging van LIMIT 10 worden de eerste 10 waarden opgehaald, waardoor de query geen time-out krijgt, en snel resultaat laat zien.

## Property niet leeg

Als een property ingevuld moet zijn met een willekeurige waarde, dan wordt die willekeurige waarde gespecificeerd met dummy0. Als er meerdere properties zo moeten zijn ingevuld, krijgt de volgende uiteraard dummy1, etc.
Wanneer je de waarde ook wilt zien:

## Label en omschrijving

Met de service:wikibase:label worden bij een item ook de labels opgehaald, met een serviceParam kan ook de taal worden gespecificeerd.
Met bijvoorbeeld language "nl,en" worden de omschrijvingen in het nederlands getoond, maar als die niet bestaat wordt de engelse omschrijving getoond

## Persoon met geboorte- en sterfdatum

Met optional geef je aan dat een waarde niet per se hoeft te bestaan. Zonder optional worden items zonder die waarde niet geselecteerd. In onderstaande query krijg je personen die wel een geboortedatum hebben, met bijbehorende sterfdatum indien die is ingevuld.

## Beroepen van Nederlanders

Met COUNT kan iets worden geteld. Met UNION kunnen twee sets worden samengevoegd (OR). Hier wordt de nationaliteit (P27) van Q29999 (Koninkrijk der Nederlanden) en Q55 (Nederland) samengevoegd. De GROUP BY zorgt dat de beroepen worden gesorteerd zodat ze bij elkaar staan, zodat COUNT ze kan tellen.

## Twee landen

Alle items met als land Finland of Zweden:

## Filter lege waarden

Soms wil je enkel de lege waarden van een veld laten zien, dit doe je met een FILTER (!bound(?<variabele>))

## Nederlandse gemeentes met meer dan 25000 inwoners

Met FILTER kun je bepaalde waarden weglaten, in dit geval gemeenten met minder dan 25001 inwoners.

## Omschrijving is "iets"

De omschrijving wordt hier op een alternatieve manier opgehaald, maar zo kan er wel worden gefilterd op een bepaalde waarde, in dit geval "gemeente" zonder de provincienaam. Hopelijk geeft de query nog resultaat, anders kun je filteren op "gemeente in XXX" waarbij XXX een van de Nederlandse provincies is.

## Tussen een periode

Deze query laat zien welke vrouwen op nl-wiki staan, die geboren zijn tussen 1850-1920. Dezelfde query voor mannen geeft momenteel een time-out.

## Alle tennisspeelsters met een FedCup-ID zonder artikel op nl-wiki

En een extra filter om enkel de items te tonen waarvan de FedCup-ID begint met een "1" of "2". Momenteel worden alle FedCUp-IDs aangepast, dus binnenkort geeft deze query geen resultaat meer, verwijder dan het laatste filter, of filter op alles dat begint met een "8". Het is nu bedoelt ter demonstratie wat er mogelijk is. De DISTINCT zorgt ervoor dat je iedere speelster maar 1x in het overzicht krijgt, anders krijg je ze voor iedere taalversie een keer.

## Items zonder afbeelding

Met FILTER not exists { ?item wdt:P18 ?image } worden items geselecteerd zonder afbeelding

## Hoofdsteden van de landen

Onderstaande query toont de items die hoofdstad zijn van een land. Het land wordt opgehaald in de variabele ?country, en aan ?hoofdstad gekoppeld in de regel daarboven.

## Stations in de buurt van

Onderstaande query zoekt alle stations die naburig zijn aan Utrecht CS.
Deze query geeft hetzelfde resultaat als deze query:

## Voedsel zonder ingredienten

Dit kan ook als volgt, met hetzelfde resultaat:

## Beroepen zonder label, gesorteerd op hoe vaak gebruikt

Deze query gaf mij eerst time-outs, maar door deze op de juiste manier te nesten was dit te omzeilen. De binnenste select vind alle beroepen zonder omschrijving, en ieder beroep wordt aan een ?item gekoppeld en vervolgens geteld. Dit wordt omgekeerd gesorteerd gepresenteerd, zodat het beroep zonder omschrijving dat het meest gebruikt wordt bovenaan staan. Omdat ik een script heb dat deze beroepen gebruikt om omschrijvingen bij personen te genereren, was dit een cruciaal script om de missende beroepen te vinden.

## Gebruik van een qualifier

Toon alle bruggen met een hoogte in <meters>

## Chinese gemeenten met de Engelse en Nederlandse naam

Zonder de optional worden de lege waarden weggefilterd.

## Nederlandse tennisers

Gesorteerd naar aantal statements dat ze ingevuld hebben

## Items met hun property

Waarbij de referentie/source/bron verwijzen naar http://web.archive/org en niet naar https

## isBLANK

Properties kunnen op "geen waarde" worden gezet, deze kunnen weer met isBLANK worden gefilterd/gevonden.

## unknown Value

Properties kunnen ook "onbekende waarde" hebben. Die zijn te vinden met isSomeValue

## filter

Filteren van items die een property in het geheel niet hebben:

## Preferred rank

Als een eigenschap een preferred rank heeft, wordt deze teruggegeven voor een wdt:Pxx query. Met p:Pxx/ps:Pxx krijg je ze allemaal, ongeacht de rank.

## RANDOM resultaat

De resultaten worden gecached, dus als je de query snel achter elkaar uitvoert, krijg je steeds hetzelfde resultaat, maar na langere/enige tijd krijg je een nieuwe set. Door "iets" aan de query te veranderen (een spatie maakt vaak al een verschil) forceer je een nieuwe resultaatset.

## Meer voorbeelden

* Wikibase SPARQL Query examples, pagina op MediaWiki
* A huge collection of examples, pagina op Wikidata - Pas op: laadt traag
* Something about query optimisation