SPARQL is de standaard query taal en protocol voor het bevragen en consulteren van Linked Open Data (LOD) op het web of voor het raadplegen van RDF triplestores.
In het kader van deze demo wordt gebruik gemaakt van de Communica Web Client. Communica is een knowledge graph querying framework.
setup: https://github.com/LinkedDataFragments/Server.js
een SPARQL query is opgebouwd uit de volgende onderdelen in volgorde:
- prefix declaratie: voor het afkorten van URIs
- dataset definitie: bepalen welke RDF graphs bevraagd worden.
- result: bepaald welke informatie uit de query moet resulteren
- query patroon: bepaald wat er precies moet gequeried worden in de de dataset
- query modificatoren: het herstructureren van de resultaten (groeperen, sorteren, ...)
# prefix declaratie
PREFIX foo: <http://example.com/resources/>
...
# dataset definitie
FROM ...
# result clause
SELECT ...
# query patroon
WHERE {
...
}
# query modificatoren
ORDER BY ...
instelling | dcat |
---|---|
personen en instellingen (alle instellingen) | http://stad.gent/ldes/personen |
thesaurus (alle instellingen) | http://stad.gent/ldes/thesaurus |
industriemuseum | http://stad.gent/ldes/industriemuseum |
archief gent | http://stad.gent/ldes/archief |
design museum gent | http://stad.gent/ldes/dmg |
huis van alijn | http://stad.gent/ldes/hva |
STAM | http://stad.gent/ldes/stam |
deze SPARQL query vraagt 100 titels op van objecten uit de LDES van het Design Museum Gent.
- PREFIX: aanduiden van de namespace waartoe een term behoort. Zo wordt cidoc de namespace "http://www.cidoc-crm.org/cidoc-crm/" toegekend met prefix dc. dc:title verwijst zo naar de term "title" in de Dublin Core namespace. Door gebruikt te maken van namespaces worden queries leesbaarder doordat niet steeds verwezen moet worden naar de URI.
- SELECT: aan de hand van SELECT gevolgd door ?term kan bepaald worden welke waarden uit de opgevraagde querie moeten worden meegegeven als resultaat. In onderstaand voorbeeld worden titels opgevraagd, in dit geval toegewezen aan ?title.
- FROM: via FROM is het mogelijk om te speciferen welke dataset in de GRAPH bevraagt dient te worden. In dit geval wordt gefocused op de dataset van het Design Museum Gent http://stad.gent/ldes/dmg.
- WHERE:
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
SELECT ?title FROM <http://stad.gent/ldes/dmg>
WHERE {
?object cidoc:P102_has_title ?title
} LIMIT 100
toevoegen van de beschrijving in de query;
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
SELECT ?title ?maker FROM <http://stad.gent/ldes/dmg>
WHERE {
?object cidoc:P102_has_title ?title
?object cidoc:P108i_was_produced_by ?maker
} LIMIT 100
FILTER kan gebruikt worden voor het filteren in de opgevraagde resultaten. Aan de hand van de functie regex() kan gezocht worden naar een substring in een string. In het onderstaande voorbeeld wensen we enkel deze objecten te ontvangen waarbij "NOVA" voorkomt in de titel.
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
SELECT ?title ?beschrijving FROM <http://stad.gent/ldes/dmg>
WHERE {
?object cidoc:P102_has_title ?title.
FILTER (regex(?title, "NOVA", "i"))
?object cidoc:P3_has_n
8C01
ote ?beschrijving
} LIMIT 100
Door gebruik te maken van DISTINCT na SELECT deze query heeft enkel resultaten met unieke titels en beschrijving terug. Op deze manier kunnen we het ophalen van meerdere versies van 1 object vermijden.
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
SELECT DISTINCT ?title ?beschrijving FROM <http://stad.gent/ldes/dmg>
WHERE {
?object cidoc:P102_has_title ?title.
FILTER (regex(?title, "NOVA", "i")).
?object cidoc:P3_has_note ?beschrijving.
} LIMIT 100
op dezelfde manier kunnen we ook een lijst opvragen met alle voorkomende vervaardigers gekoppeld aan objecten waarbij "NOVA" voortkomt in de titel aan de hand van de volgende query;
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select distinct ?maker from <http://stad.gent/ldes/dmg>
where {
?object cidoc:P102_has_title ?title.
FILTER (regex(?title, "NOVA", "i"))
?object cidoc:P108i_was_produced_by ?p.
?p cidoc:P14_carried_out_by ?m.
?m rdfs:label ?maker
}
aan de hand van GRAPH (?g) is het ook mogelijk om de naam van de geraadpleegde graph mee op te vragen.
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?g ?maker ?title ?desc
FROM <http://stad.gent/ldes/dmg>
WHERE {
?object cidoc:P102_has_title ?title.
FILTER (regex(?title, "NOVA", "i"))
{?object cidoc:P108i_was_produced_by ?p.
?p cidoc:P14_carried_out_by ?m.
?m rdfs:label ?maker
FILTER (regex(?maker, "Riche, Roger", "i"))
?object cidoc:P3_has_note ?desc.}
UNION
{GRAPH ?g
{?object cidoc:P108i_was_produced_by ?p.
?p cidoc:P14_carried_out_by ?m.
?m rdfs:label ?maker.
FILTER (regex(?maker, "Calor", "i"))
?object cidoc:P3_has_note ?desc.
}
}
}
door het toevoegen van meerdere bronnen via de FROM statement kan een query opgesteld worden die over de verschillende collecties heen zoekt.
Federated Queries zijn bevragingen van meerdere datasets in dezelfde vraag.
- SERVICE: aan de hand van SERVICE is het mogelijk om eenm subquery in een andere query te plaatsen. Om twee verschillende datasets te raadplegen is het nodig om elke query in een eigen subquery te plaatsen.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX cidoc: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX aat: <http://vocab.getty.edu/aat/>
PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT DISTINCT ?collectie ?label ?t ?v ?v2 ?v3
WHERE {
?object cidoc:P46i_forms_part_of ?collectie.
?collectie cidoc:P2_has_type ?typeCollectie.
?typeCollectie skos:prefLabel ?label
FILTER (lang(?label) = "nl")
BIND (URI(REPLACE(str(?typeCollectie), "page/", "")) AS ?t).
optional {
?t skos:note ?nlAbstract.
optional {?nlAbstract rdf:value ?v
FILTER (lang(?v) = "nl")}
}
optional {
?t skos:note ?enAbstract.
?enAbstract rdf:value ?v2
FILTER (lang(?v2) = "en")
}
optional {
?t skos:note ?zhHantAbstract.
?zhHantAbstract rdf:value ?v3
FILTER (lang(?v3) = "zh-hant")
}
}
- alle objecten met een vrouwelijke maker
- alle objecten gerelateerd aan Gent
- alle objecten gemaakt tijdens WOI
- plotten van objecten op een kaart
- alle "portretten" van makers uit de collectie (via Wikimedia)