LinkedData@vlaanderen: uri strategie en vocabularyrichtlijnen versie 1.0 http://www.vlaanderen.be/opendata info@opendataforum.info Skype: opendataforum_ LinkedIn: Open Data Group
Inhoudsopgave 1/ Achtergrond... 3 2/ Taak 1: het toekennen van een HTTP identifier aan individuele entiteiten... 4 3/ Taak 2: het toekennen van een label... 7 4/ Taak 3: het aanduiden van het type van het ding... 8... 10 5.1/ Aanbevolen vocabularia... 10 5.1.1/ Voor personen: FOAF... 11 5.1.2/ Voor organisaties: ORG... 13 5.1.3/ Voor contactinformatie: vcard... 14 5.1.4/ Voor het beschrijven van publieke diensten: Core Public Service... 15 5.1.5/ Voor locatie: Basic Geo (WGS84 lat/long) Vocabulary... 16 5.1.6/ Voor ruimtelijke objecten: GeoSparql... 17 5.1.7/ Voor tijd: Time... 18 5.1.8/ Voor events: Event... 19 5.1.9/ Voor statistische informatie (metingen, observaties): Data Cube... 21 5.1.10/ Voor documenten, publicaties, informatie items: Dublin Core... 22 5.1.11/ Voor begrippen in knowledge organisation systems: SKOS... 23 5.1.12/ Voor het beschrijven van RDF datasets: VoID... 24 5.1.13/ Voor het beschrijven van de herkomst van de data: PROV... 25 5.2/ Een eigen vocabularium maken (eigen klassen en properties)... 26 5.3/ Value vocabularies... 27 6/ Besluit... 28 ACHTERGROND
1 ACHTERGROND Dit document situeert zich in het engagement om de data van de Vlaamse Overheid als Open Data te publiceren en dit met de hoogst mogelijke kwaliteit. Daarbij wordt dikwijls verwezen naar volgende sterren classificatie m.b.t. Open Data. Available on the web (whatever format) but with an open licence, to be Open Data Available as machine-readable structured data (e.g. excel instead of image scan of a table) as (2) plus non-proprietary format (e.g. CSV instead of excel) All the above plus, Use open standards from W3C (RDF and SPARQL) to identify things, so that people can point at your stuff All the above, plus: Link your data to other people s data to provide context De conceptnota goedgekeurd door de Vlaamse Regering gaat uit van minimaal 3 sterren. Op termijn willen wij naar 4 en 5 sterren evolueren en onze data publiceren binnen het Linked Open Data Web. Dan moeten we voldoen aan volgende Linked Data principes: 1/Use URIs to name things; 2/Use HTTP URIs so that things can be referred to and looked up ( dereferenced ) by people and user agents; 3/When someone looks up a URI, provide useful information, using the open Web standards such as RDF, SPARQL; 4/Include links to other related things using their URIs when publishing on the Web. Dit betekent dat wij aan de entiteiten (scholen, hospitalen, departementen, gebouwen, ) waarvan wij de authentieke data beheren en willen publiceren een URL moeten toekennen. De vraag stelt zich dan hoe we dit dan het best doen? Dit document biedt hiervoor een aantal patronen en richtlijnen. Uitgangspunt was om deze richtlijnen zo simpel en beperkt mogelijk te houden. Dit is een concrete uitwerking van de adviezen en mogelijke opties zoals die zijn gepresenteerd in het document URI strategie data.vlaanderen gemaakt in het kader van het LOD2 project door zijn Belgische partner Tenforce. 1/ Achtergrond 3
2 TAAK 1: HET TOEKENNEN VAN EEN HTTP IDENTIFIER AAN INDIVIDUELE ENTITEITEN REGELS Regel 1: zorg ervoor dat de URI uniek is Regel 2: zo n URL moet zo kort mogelijk zijn en eenvoudig te begrijpen voor zowel mens en machine. Regel 3: zo n URL moet ontworpen zijn om eeuwig mee te gaan. M.a.w. een identifier moet blijvend zijn, ook wel persistent genoemd. Dit betekent dat alles wat mogelijk variabel is uit de URL geweerd moet worden en dat een URL nooit verwijderd mag worden. Volgende aspecten nemen we dan beter niet op in de vorming van URL s: de organisatie(naam) die de URL s en bijhorende data publiceert merk-, product- of marketing namen status rol of functie Al deze aspecten zijn eerder tijdelijk en verhogen dus de kans dat URL s moeten veranderen daarbij de eeuwigheidswaarde ondermijnend. STRUCTUUR VAN EEN URL De notatie die we hier hanteren is gebaseerd op de URI template specificatie gedefinieerd in RFC6570 met een uitbreiding om repetitie van patronen aan te duiden. Een volledig patroon http://{domein}{/collection}*[{/type}{/key}]+[{/dateversion}]?#id Teken Betekenis? 0 of 1 keer voorkomend * 0 of meerdere keren + 1 of meerdere keren [] eenheid (horen samen) {} in te vullen onderdeel TOELICHTING BIJ DE ONDERDELEN a) domein (verplicht) Domein is een internet DNS name. Regel: De entiteit die een domein gebruikt bij het samenstellen van een URL moet eigenaarschap en authoriteit hebben over dit domein. Aanbeveling: Om het (sub)domein te laten beginnen met data zodat het duidelijk is dat er data gepubliceerd worden in tegenstelling tot documenten. Voorbeelden: data.vlaanderen.be data.toerismevlaanderen.be (ervan uitgaand dat dit domein persistent is) data.delijn.be (ervan uitgaand dat dit domein persistent is) Men kan indien nodig nog verder opsplitsen gebruik makend van subdomeinen. 2/ Taak 1: het toekennen van een HTTP identifier aan individuele entiteiten 4
Voorbeeld: toerisme.data.vlaanderen.be b) collectie (optioneel) Een collectie dient om een verdere opdeling van het domein mogelijk te maken zonder daarom beroep te moeten doen op DNS instellingen. Voorbeelden: data.vlaanderen.be/toerisme data.vlaanderen.be/openbaar-transport Dit kan nog verder worden verfijnd indien nodig/handig. Maar hou rekening met de regel: korter is beter. Voorbeeld: data.vlaanderen.be/toerisme/dagtoerisme Collecties kunnen ook gebruikt worden om er zeker voor te zorgen dat de HTTP identifier uniek is. Aanbeveling: met betrekking tot de vraag subdomeinen binnen data.vlaanderen.be of collecties. Als het om een op zichzelf staand zelfstandig domein gaat raden wij een subdomein aan; gaat het eerder om het verdelen van een domein dan gebruikt men beter collecties. c) type en key in duo (verplicht) type geeft een hint voor mensen wat voor soort ding er beschreven wordt: een school, een hotel, een bushalte,. Voorbeeld: data.vlaanderen.be/toerisme/logie key is dan de echte unieke sleutel die het ding krijgt in de dataset. Die key wordt meestal overgenomen van de natuurlijke key die er in de oorspronkelijke data zit of gevormd op basis van beschikbare velden. Voorbeelden: data.vlaanderen.be/toerisme/logie/lovl123 data.vlaanderen.be/toerisme/logie/adoma (gevaar: mogelijks niet uniek) data.vlaanderen.be/onderwijs/school/s100032 Dit patroon mag herhaald voorkomen indien er een duidelijke hiërarchie kan gebruikt worden om de entiteit/ding te identificeren. Voorbeelden: data.vlaanderen.be/onderwijs/school/s100032/klas/6a data.vlaanderen.be/onderwijs/thesaurus/onderwijsniveaus/term/basisonderwijs Aanbeveling: hoe de key samenstellen indien de bron geen echte identifier heeft maar enkel een textueel label of titel? We gebruiken dan dat label of die titel, maar normalizeren de tekst: zet in lowercase haal alle karakters weg die speciale URL encoding nodig hebben (deze karakters vindt men op http://www.blooberry.com/indexdot/ html/topics/urlencoding.htm; enkele voorbeelden: $, &, +,<, {.). vervang spaties met een verbindingsstreepje 2/ Taak 1: het toekennen van een HTTP identifier aan individuele entiteiten 5
verifieer of het resultaat uniekheid garandeert (zo niet, voeg een context (collectie) toe in het pad). Voorbeeld: data.vlaanderen.be/toerisme/logie/hotel-zonnestraal d) datum of versie (optioneel en exceptioneel) Voor de meeste entiteiten is het zeker niet nodig om voor het geven van een identifier een tijdsindicatie mee te geven in de URI. Ik blijf ook gedurende gans mijn leven hetzelfde sociaal zekerheidsnummer behouden, al verander ik dagelijks. Maar klas 6A in school S100032 is wel elk jaar anders; dat kan en mag dan opgevangen worden door tijdsinformatie op te nemen in de URL. Aanbeveling: Voor het aanduiden van tijd in URL s wordt het W3C Date Time formaat gebruikt. Wenst men een versie nummer te geven dan gebruikt men volgend patroon vx(.y)? waarbij X een integer is en de major versie voorstelt en Y optioneel de minor versie. Voorbeelden: data.vlaanderen.be/onderwijs/school/s100032/klas/6a/2013-09 data.vlaanderen.be/software/linked-data-server/v2.4 e) #id Aanbeveling: We raden aan alle identifiers van dingen af te sluiten met #id. Daardoor is het voor de gebruiker duidelijk dat het een identifier is van een ding. Op deze manier vermijden we het implementeren van een 303 See Other redirect. Zie het Linked Data boek op http://linkeddatabook.com/editions/1.0/#htoc12. Wie wel 303 wil implementeren, mag dat natuurlijk. Dan bevelen wij volgend patroon aan: http://{domein}{/collection}*/id/[{/type}{/key}]+[{/dateversion}]? Wat dan leidt naar een 303 Location: http://{domein}{/collection}*/doc/[{/type}{/key}]+[{/dateversion}]? f) Voorbeelden Aanbeveling: korter is beter, maar ook niet te kort zodat er geen uniekheid meer gegarandeerd is. Standaard toepasbaar in de meeste gevallen http://{domein}{/type}{/key}#id http://{domein}{/collectie}*{/type}{/key}#id Bij hiërarchische identificatie http://{domein}[{/type}{/key}]+#id http://{domein}{/collectie}*[{/type}{/key}]+#id Bij tijdsgebonden entiteiten http://{domein}{/collection}*[{/type}/{key}]+[{/dateversion}]?#id http://data.vlaanderen.be/logie/lovl123#id http://toerisme.data.vlaanderen.be/logie/adoma#id http://toerisme.data.vlaanderen.be/logie/lovl123#id http://data.toerismevlaanderen.be/logie/lovl123#id http://data.vlaanderen.be/toerisme/logie/lovl123#id http://data.vlaanderen.be/toerisme/logie/adoma#id http://data.vlaanderen.be/logie/lovl123/kamer/12#id http://toerisme.data.vlaanderen.be/logie/adoma/kamer/12#id http://toerisme.data.vlaanderen.be/logie/lovl123/kamer/12#id http://data.toerismevlaanderen.be/logie/lovl123/kamer/12#id http://data.vlaanderen.be/toerisme/logie/lovl123/kamer/12#id http://data.vlaanderen.be/toerisme/logie/adoma/kamer/12#id http://data.vlaanderen.be/onderwijs/school/s100032/klas/6a/2013-09#id http://data.vlaanderen.be/school/s100032/klas/6a/2013-09#id http://onderwijs.data.vlaanderen.be/school/s100032/klas/6a/2013-09#id 2/ Taak 1: het toekennen van een HTTP identifier aan individuele entiteiten 6
3 TAAK 2: HET TOEKENNEN VAN EEN LABEL Elk ding moeten we een menselijk leesbaar label geven. Voorbeelden: ID label http://toerisme.data.vlaanderen.be/logie/adoma#id Hotel Adoma http://data.vlaanderen.be/onderwijs/school/s100032#id Sint-Lutgardisinstituut http://onderwijs.data.vlaanderen.be/school/s100032/klas/6a/2013-09#id Sint-Lutgardisinstituut, klas 6A, schooljaar 2013-2014 Voor het toekennen van een label bestaat er een standaard: <http://www.w3.org/2000/01/rdf-schema#label>, afgekort rdfs:label We krijgen dan uitspraken die uit 3 delen bestaan (triples): Waarover gaat het (subject) Welke property (predicate) Met welke value <http://toerisme.data.vlaanderen.be/logie/adoma#id> <http://www.w3.org/2000/01/rdf-schema#label> Hotel Adoma Door het vastleggen van het prefix rdfs dat staat voor het URI deel <http://www.w3.org/2000/01/rdf-schema#> kunnen we <http://www.w3.org/2000/01/rdf-schema#label> afkorten tot rdfs:label. Enkele voorbeelden: @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. <http://toerisme.data.vlaanderen.be/logie/adoma#id> rdfs:label Hotel Adoma. <http://data.vlaanderen.be/onderwijs/school/s100032#id> rdfs:label Sint-Lutgardisinstituut. <http://onderwijs.data.vlaanderen.be/school/s100032/klas/6a/2013-09#id> rdfs:label Sint-Lutgardisinstituut, klas 6A, schooljaar 2013-2014 3/ Taak 2: het toekennen van een label 7
4 TAAK 3: HET AANDUIDEN VAN HET TYPE VAN HET DING Verder duid je best ondubbelzinnig aan om wat voor type ding het gaat. Voorbeeld: http://toerisme.data.vlaanderen.be/logie/adoma#id Dit is een hotel. Meer specifiek http://toerisme.data.vlaanderen.be/logie/adoma#id is een instantie van de klasse hotel. Op het linked open data web wordt die klasse hotel ook aangeduid met een HTTP identifier. Er zijn nu 2 mogelijkheden: ofwel gebruik je al een bestaande identifier ofwel definieer je zelf een klasse voor hotels. Best practice: kijk eerst of er al een klasse voor hotels beschikbaar is op het linked open data web. Een handig hulpmiddel hiervoor is de LOV website: http://lov.okfn.org/dataset/lov/index.html Een zoekactie op hotel levert dan de volgende resultaten: 4/ Taak 3: het aanduiden van het type van het ding 8
Men krijgt een aantal zoekresultaten die verder onderzocht moeten worden of ze de behoeften afdekken. Eén van de resultaten is acco:hotel, wat een afkorting is voor http://purl.org/acco/ns#hotel. Hotel is een klasse gedefinieerd in het vocabularium met naam http://purl.org/acco/ns#. Daar vinden we volgende uitleg: En hotel zelf is als volgt gedefinieerd: Op basis hiervan kunnen we beslissen om deze klasse te gebruiken: ID http://toerisme.data.vlaanderen.be/logie/adoma#id type http://purl.org/acco/ns#hotel Voor het toekennen van een ding aan een klasse bestaat er een standaard: <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>. We krijgen dan uitspraken die uit 3 delen bestaan (triples): Waarover gaat het (subject) Welke property (predicate) Met welke value <http://toerisme.data.vlaanderen.be/logie/adoma#id> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/acco/ns#hotel> Door het vastleggen van het prefix rdf dat staat voor het URI deel <http://www.w3.org/1999/02/22-rdf-syntax-ns#> kunnen we <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> afkorten tot rdf:type. We krijgen dan: @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. <http://toerisme.data.vlaanderen.be/logie/adoma#id> rdf:type <http://purl.org/acco/ns#hotel>. In het volgende deel beschrijven we vocabularia die veel voorkomende klassen beschrijven: Persoon, Organisatie, Event,... 4/ Taak 3: het aanduiden van het type van het ding 9
5 TAAK 4: HET BESCHRIJVEN VAN HET DING In onze back offices beheren wij de data van de entiteiten waar wij de authentieke bron van zijn. hun kenmerken (attributen), b.v. het aantal kamers van een hotel, het mailadres van een persoon. hun relaties, b.v. persoon a werkt in departement x en rapporteert aan persoon b. Belangrijk: In het linked open data verhaal moeten deze attributen en relaties ook een unieke http identifier krijgen. Dit om zo éénduidig mogelijk te zijn. Best practice: Maak gebruik van al bestaande vocabularia (klasses, attributen/relaties) om uw entiteiten te beschrijven. Een overzicht van bestaande vocabularia vindt men op: http://lov.okfn.org/dataset/lov/index.html. De hieronder beschreven lijst bestaat uit vocabularia die al veelvuldig gebruikt zijn en hun degelijkheid hebben bewezen. 5.1 AANBEVOLEN VOCABULARIA Voor het beschrijven van Personen Organisaties Contactinformatie Services Locaties Tijd Events Statistische observaties/metingen Documenten, publicaties, informatie assets Concepten/begrippen Datasets Provenance Gebruik vocabularium FOAF ORG, ROV vcard Core Public Service Geo, GeoSparql Time Event Data Cube Dublin Core SKOS VOID PROV Zeer belangrijk: bij de beschrijving van een entiteit kan men properties uit verschillende vocabularia gebruiken; men hoeft zich dus niet te beperken tot één vocabularium. 10
5.1.1 VOOR PERSONEN: FOAF Voor het beschrijven van personen raden wij FOAF aan. Documentatie te vinden op: http://xmlns.com/foaf/spec/ Metadata van FOAF: http://lov.okfn.org/dataset/lov/details/vocabulary_foaf.html URL van het vocabularium: <http://xmlns.com/foaf/0.1/> Deze URL leidt naar RDF en HTML representaties op basis van de http ACCEPT header. Schematisch: Klasse Persoon: 11
Voorbeelden Beschrijving van Persoon 1 Daarbij maken we gebruik van volgende properties gedefinieerd door het foaf vocabularium (tussen haakjes ziet u de klasse) : family_name (Person), firstname (Person), gender (Agent), name, mbox=mailbox (Agent), workinfohomepage (Person). <http://data.vlaanderen.be/persoon/a123#id> rdf:type foaf:person <http://data.vlaanderen.be/persoon/a123#id> rdfs:label Noël Van Herreweghe <http://data.vlaanderen.be/persoon/a123#id> foaf:family_name Van Herreweghe <http://data.vlaanderen.be/persoon/a123#id> foaf:firstname Noël <http://data.vlaanderen.be/persoon/a123#id> foaf:gender male http://data.vlaanderen.be/persoon/a123#id> foaf:name Noël Van Herreweghe http://data.vlaanderen.be/persoon/a123#id> foaf:mbox <mailto:noel.vanherreweghe@bz.vlaanderen.be> http://data.vlaanderen.be/persoon/a123#id> foaf:workinfohomepage <http://www.opendataforum.be/> Beschrijving van Persoon 2 Waarover het gaat (ID) Attribuut/relatie waarde <http://data.vlaanderen.be/persoon/b345#id> rdf:type foaf:person <http://data.vlaanderen.be/persoon/b345#id> rdfs:label Mathias De Schrijver <http://data.vlaanderen.be/persoon/b345#id> foaf:family_name De Schrijver <http://data.vlaanderen.be/persoon/b345#id> foaf:firstname Mathias <http://data.vlaanderen.be/persoon/b345#id> foaf:gender male http://data.vlaanderen.be/persoon/b345#id> foaf:name Mathias De Schrijver http://data.vlaanderen.be/persoon/b345#id> foaf:mbox <mailto:mathias.deschrijver@bz.vlaanderen.be> En bovendien kennen zij elkaar, gebruik makend van de relatie knows (Person): Waarover het gaat (ID) Attribuut/relatie waarde <http://data.vlaanderen.be/persoon/a123#id> foaf:knows <http://data.vlaanderen.be/persoon/b345#id> <http://data.vlaanderen.be/persoon/b345#id> foaf:knows <http://data.vlaanderen.be/persoon/a123#id> Opmerking: Op europees niveau is er het Core Person Vocabulary ontwikkeld https://joinup.ec.europa.eu/asset/core_person/description. Maar zolang de in dit vocabularium gebruikte URL s niet resolven (niks teruggeven) raden wij het gebruik ervan in een LOD context niet aan. 12
5.1.2 VOOR ORGANISATIES: ORG Voor het beschrijven van organisaties raden wij ORG aan. Documentatie: http://www.w3.org/tr/vocab-org/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_org.html URL: <http://www.w3.org/ns/org#> Deze URL leidt enkel naar een machine readable versie. Klasse Organisatie: Voorbeeld: In dit voorbeeld gebruiken we de properties suborganizationof, hassite, hasprimarysite uit het Organization vocabularium. <http://data.vlaanderen.be/organisatie/o876#id> rdf:type org:organization <http://data.vlaanderen.be/organisatie/o876#id> rdfs:label Studiedienst van de Vlaamse Regering <http://data.vlaanderen.be/organisatie/o876#id> org:suborganizationof <http://data.vlaanderen.be/organisatie/o987#id> <http://data.vlaanderen.be/organisatie/o876#id> org:hasprimarysite <http://www.vlaanderen.be/svr> <http://data.vlaanderen.be/organisatie/o876#id> org:hassite <http://www.lokalestatistieken.be> Opmerking: Er is een profiel van dit vocabularium gemaakt om legaal geregistreerde organisaties zoals bedrijven te beschrijven: Registered Organization Vocabulary. Documentatie te vinden op: http://www.w3.org/tr/vocab-regorg/ Metadata van ROV: http://lov.okfn.org/dataset/lov/details/vocabulary_rov.html URL van het vocabularium: <http://www.w3.org/ns/regorg#> De URL leidt enkel naar een niet machine readable versie. Dit vocabularium bevat syntax errors (invalid RDF) en kan dus niet gebruikt worden. 13
5.1.3 VOOR CONTACTINFORMATIE: VCARD Voor het vastleggen van contactinformatie van personen en organisaties het vcard vocabularium. Documentatie: http://www.w3.org/tr/vcard-rdf/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_vcard.html URL: <http://www.w3.org/2006/vcard/ns#> Opgelet: er is een nieuwe versie van vcard in de maak; een aantal klassen en properties worden deprecated. Klasse Adres: Voorbeeld: Om een adres te beschrijven gebruiken we volgende properties: streetaddress, postalcode, locality, country. <http://data.vlaanderen.be/adres/a543#id> rdf:type vc:address <http://data.vlaanderen.be/adres/a543#id> rdfs:label adres Boudewijngebouw <http://data.vlaanderen.be/adres/a543#id> vc:streetaddress Boudewijnlaan 30 bus 23 <http://data.vlaanderen.be/adres/a543#id> vc:postalcode 1000 <http://data.vlaanderen.be/adres/a543#id> vc:locality Brussel <http://data.vlaanderen.be/adres/a543#id> vc:country België We kunnen dit adres dan gebruiken bij attribuut hasaddress van de hierboven al beschreven organisatie. <http://data.vlaanderen.be/organisatie/o876#id> rdf:type org:organization <http://data.vlaanderen.be/organisatie/o876#id> rdfs:label Studiedienst van de Vlaamse Regering <http://data.vlaanderen.be/organisatie/o876#id> vc:hasaddress <http://data.vlaanderen.be/adres/a543#id> <http://data.vlaanderen.be/organisatie/o876#id> vc:email svr@dar.vlaanderen.be <http://data.vlaanderen.be/organisatie/o876#id> vc:telephone 02 553 52 07 Opmerking: Op europees niveau is er het Core Location Vocabulary ontwikkeld https://joinup.ec.europa.eu/asset/core_location/description. Maar zolang de in dit vocabularium gebruikte URL s niet resolven (niks teruggeven) raden wij het gebruik ervan in een LOD context niet aan. 14
5.1.4 VOOR HET BESCHRIJVEN VAN PUBLIEKE DIENSTEN: CORE PUBLIC SERVICE Voor het beschrijven van de diensten die de overheid/publieke sector biedt. Documentatie: https://joinup.ec.europa.eu/asset/core_public_service/description URL: <http://purl.org/vocab/cpsv#> De URL leidt enkel naar een machine readable versie. <http://data.vlaanderen.be/service/s346#id> rdf:type cpsv:publicservice <http://data.vlaanderen.be/service/s346#id> rdfs:label het afleveren van een stedenbouwkundige vergunning 15
5.1.5 VOOR LOCATIE: BASIC GEO (WGS84 LAT/LONG) VOCABULARY Om een ruimtelijk object als punt geografisch te situeren. Documentatie: http://www.w3.org/2003/01/geo/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_geo.html URL: <http://www.w3.org/2003/01/geo/wgs84_pos#> Deze URL leidt naar RDF en HTML representaties op basis van de http ACCEPT header. Voorbeeld: We gebruiken de properties lat en long om in dit geval een gebouw als geografisch punt te localiseren. http://data.vlaanderen.be/gebouw/boudewijngebouw#id> rdf:type geo:spatialthing <http://data.vlaanderen.be/adres/a543#id> rdfs:label Boudewijngebouw <http://data.vlaanderen.be/adres/a543#id> geo:lat 50.856776 <http://data.vlaanderen.be/adres/a543#id> geo:long 4.354802 16
5.1.6 VOOR RUIMTELIJKE OBJECTEN: GEOSPARQL Documentatie: http://www.opengeospatial.org/standards/geosparql Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_gsp.html URL: <http://www.opengis.net/ont/geosparql#> De URL leidt enkel naar een machine readable versie. Klasse Spatial Object: Voorbeeld: Het Boudewijngebouw heeft een geometry; meer specifiek een punt gedefinieerd in GML. http://data.vlaanderen.be/gebouw/boudewijngebouw#id> rdf:type geo:feature <http://data.vlaanderen.be/adres/a543#id> rdfs:label Boudewijngebouw <http://data.vlaanderen.be/adres/a543#id> geo:hasgeometry <http://data.vlaanderen.be/geometry/a543#id> <http://data.vlaanderen.be/geometry/a543#id> rdf:type sf:point <gml:point gml:id=\ p21\ srsname=\ http://www.opengis. net/def/crs/epsg/0/4326\ > <gml:coordinates>4.354802, 50.856776</gml:coordinates> <http://data.vlaanderen.be/geometry/a543#id> geo:asgml </gml:point> ^^geo:gmlliteral 17
5.1.7 VOOR TIJD: TIME Voor het beschrijven van tijdsentiteiten, het Time vocabularium. Documentatie: http://www.w3.org/tr/owl-time/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_time.html URL: <http://www.w3.org/2006/time#> De URL leidt enkel naar een machine readable versie. Klasse TemporalEntity : Voorbeeld: Voor het vastleggen van een tijdsinterval gebruiken we hasbeginning en hasend van het time vocab. <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> rdf:type time:temporalentity <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> time:hasbeginning <http://data.standaarden.nl/opendata/starttijd/t4532987#id> <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> time:hasend <http://data.standaarden.nl/opendata/eindtijd/t4532987#id> <http://data.standaarden.nl/opendata/starttijd/ T4532987#id> time:inxsddatetime 2013-06-14T09:00:00 ^^xsd:datetime <http://data.standaarden.nl/opendata/eindtijd/ T4532987#id> time:inxsddatetime 2013-06-14T18:00:00 ^^xsd:datetime 18
5.1.8 VOOR EVENTS: EVENT Voor het beschrijven van events, de Event ontologie. Documentatie: http://motools.sourceforge.net/event/event.html Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_event.html URL: <http://purl.org/net/c4dm/event.owl#> URL leidt naar RDF en HTML representaties op basis van de http accept header. Schematisch overzicht: Klasse Event : Voorbeeld: <http://data.standaarden.nl/opendata/event/ opendatadag2013#id> rdf:type event:event <http://data.standaarden.nl/opendata/event/ opendatadag2013#id> rdfs:label Open Data dag van de Vlaamse overheid 2013 <http://data.standaarden.nl/opendata/event/ opendatadag2013#id> event:agent <http://data.vlaanderen.be/persoon/a123#id> <http://data.standaarden.nl/opendata/event/ opendatadag2013#id> event:place <http://data.vlaanderen.be/gebouw/boudewijngebouw#id> <http://data.standaarden.nl/opendata/event/ opendatadag2013#id> event:time <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> time:hasbeginning <http://data.standaarden.nl/opendata/starttijd/t4532987#id> <http://data.standaarden.nl/opendata/tijdsinterval/t4532987#id> time:hasend <http://data.standaarden.nl/opendata/eindtijd/t4532987#id> 19
<http://data.standaarden.nl/opendata/starttijd/t4532987#id> time:inxsddatetime 2013-06-14T09:00:00 ^^xsd:datetime <http://data.standaarden.nl/opendata/eindtijd/t4532987#id> time:inxsddatetime 2013-06-14T18:00:00 ^^xsd:datetime Opmerking 1: Het herbruik van het Time vocabularium (cf. supra) zorgt voor indirectie. Dit betekent dat men eerst naar een instantie van time:temporalentity moet verwijzen alvorens men start en einde kan ingeven. Dit kan veel simpler en directer door dit mechanisme te vervangen met schema:startdate en schema:enddata met schema als prefix voor http://schema.org/. Dan krijgen we: <http://data.standaarden.nl/opendata/event/opendatadag2013#id> schema:startdate 2013-06-14T09:00:00 ^^xsd:datetime <http://data.standaarden.nl/opendata/event/opendatadag2013#id> schema:enddate 2013-06-14T18:00:00 ^^xsd:datetime Opmerking 2: Er zijn nog 2 andere vocabs voor het beschrijven van events die goed bruikbaar zijn: lode Documentatie: http://linkedevents.org/ontology/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_lode.html URL: <http://linkedevents.org/ontology/> sem Documentatie: http://www.cs.vu.nl/~guus/papers/hage11b.pdf Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_sem.html URL: <http://semanticweb.cs.vu.nl/2009/11/sem/> 20
5.1.9 VOOR STATISTISCHE INFORMATIE (METINGEN, OBSERVATIES): DATA CUBE Voor het vastleggen van statistische observaties over verschillende dimensies, DataCube Documentatie: http://www.w3.org/tr/vocab-data-cube/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_qb.html URL: <http://purl.org/linked-data/cube#> De URL leidt enkel naar een machine readable versie. Klasse Observation : Een simpel en beperkt voorbeeld: De gebruikte prefixen: prefix qb: <http://purl.org/linked-data/cube#> prefix eg: <http://example.org/ns#> prefix sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#> prefix sdmx-code: <http://purl.org/linked-data/sdmx/2009/code#> prefix sdmx-attribute: <http://purl.org/linked-data/sdmx/2009/attribute#> <http://data.vlaanderen.be/demografie/observatie/34257#id> rdf:type qb:observation <http://data.vlaanderen.be/demografie/observatie/34257#id> qb:dataset <http://data.vlaanderen.be/demografie/ dataset/levensverwachting#id> <http://data.vlaanderen.be/demografie/observatie/34257#id> eg:refarea <http://dbpedia.org/resource/flemish_region> <http://data.vlaanderen.be/demografie/observatie/34257#id> eg:refperiod <http://reference.data.gov.uk/id/gregorian-interval/2004-01-01t00:00:00/p3y> <http://data.vlaanderen.be/demografie/observatie/34257#id> sdmx-dimension:sex sdmx-code:sex-m <http://data.vlaanderen.be/demografie/observatie/34257#id> sdmx-attribute:unitmeasure <http://dbpedia.org/resource/year> <http://data.vlaanderen.be/demografie/observatie/34257#id> eg:lifeexpectancy 76.6 Opmerking: het data cube vocabularium is redelijk complex. Verwachting is dat er de volgende jaren tools zullen verschijnen die vertrekkend van een spreadsheet redelijk geautomatiseerd linked data volgens het data cube vocabularium kunnen genereren. 21
5.1.10 VOOR DOCUMENTEN, PUBLICATIES, INFORMATIE ITEMS: DUBLIN CORE Voor het beschrijven van informatie objecten: Dublin Core. Dit vocabularium is zeer generiek en wordt ook dikwijls gebruikt voor het beschrijven andere types van entiteiten. Documentatie: http://dublincore.org/documents/2012/06/14/dcmi-terms/?v=elements Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_dcterms.html URL: http://purl.org/dc/terms/ URL leidt naar RDF en HTML representaties op basis van de http accept header. Voorbeeld: <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> rdf:type foaf:document <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> rdfs:label Open data dag aankondiging ^^xsd:string <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:title 14 Juni 2013: Open Data Dag in Vlaanderen! ^^xsd:string <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:contributor <http://data.vlaanderen.be/persoon/ B345#id> <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:creator <http://data.vlaanderen.be/persoon/ A123#id> <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:date 2013-05-05 ^^xsd:date <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:description Programma van de open data dag van de Vlaamse overheid in Brussel ^^xsd:string <http://www.opendataforum.be/news/14-juni-2013-open-datadag-in-vlaanderen> dcterms:subject <http://data.vlaanderen.be/id/concept/ open-data#id> Opmerking: Omdat het hier gaat om het toekennen van metadata aan een bestaande webpagina (een informatie object dat wel over het web kan verstuurd worden) gebruikt die zijn bestaand url-adres als identifier en hoeft de #id in dit geval dus niet. Er moet immers geen onderscheid gemaakt worden tussen het ding en het document dat het ding beschrijft. 22
5.1.11 VOOR BEGRIPPEN IN KNOWLEDGE ORGANISATION SYSTEMS: SKOS Voor het maken van thesauri, controlled vocabularies, waarmee andere zaken, meestal informatie objecten, kunnen geclassificeerd worden. Documentatie: http://www.w3.org/2009/08/skos-reference/skos.html Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_skos.html URL: <http://www.w3.org/2004/02/skos/core#> URL leidt naar RDF en HTML representaties op basis van de http accept header. Klasse Concept : Voorbeeld: Voortwerkend op het dublin core voorbeeld (cf. supra) kunnen we nu met behulp van skos het subject van die pagina verder uitwerken. dcterms:subject En <http://data.vlaanderen.be/id/concept/open-data#id> verder uitwerken m.b.v. skos: <http://data.vlaanderen.be/id/concept/open-data#id> rdf:type skos:concept <http://data.vlaanderen.be/id/concept/open-data#id> skos:preflabel open data @nl <http://data.vlaanderen.be/id/concept/open-data#id> skos:preflabel data ouverts @fr <http://data.vlaanderen.be/id/concept/open-data#id> <http://data.vlaanderen.be/id/concept/open-data#id> skos:broader skos:related <http://www.opendataforum.be/news/14-juni-2013-open-data-dag-invlaanderen> <http://data.vlaanderen.be/id/concept/open-data#id> <http://data.vlaanderen.be/id/concept/data#id> <http://data.vlaanderen.be/id/concept/ open-data-standaarden#id> 23
5.1.12 VOOR HET BESCHRIJVEN VAN RDF DATASETS: VOID VOID staat voor Vocabulary of Interlinked Datasets. Documentatie: http://www.w3.org/tr/void/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_void.html URL: <http://rdfs.org/ns/void#> Klasse Dataset : Opmerking: Zo n void file gaat men zelden handmatig editeren maar eerder automatisch genereren vanuit een database (triple store). Hieronder een voorbeeld van bij de Nederlandse overheid, in bestandsformaat turtle. <http://data.stelselvanbasisregistraties.nl/stelselcatalogus/id/dataset/sc> a void:dataset, prov:entity ; rdfs:label Stelselcatalogus dataset ; dcterms:description Begrippen en gegevenselementen zoals gebruikt door de basisregistraties ; dcterms:title Stelselcatalogus dataset ; void:classes 6 ; void:datadump <http://data.stelselvanbasisregistraties.nl/stelselcatalogus.ttl> ; void:distinctobjects 4297 ; void:distinctsubjects 1200 ; void:entities 1200 ; void:exampleresource <http://data.stelselvanbasisregistraties.nl/bag/id/gegevenselement/documentdatum_mutatie_nummeraanduiding-nummeraanduiding>, <http://data.stelselvanbasisregistraties.nl/bag/id/concept/openbare_ruimte>, <http://data.stelselvanbasisregistraties.nl/overheid/id/basisregistratie/nhr>, <http://data.stelselvanbasisregistraties.nl/bag/id/ gegevenselement/postcode-nummeraanduiding>, <http://data.stelselvanbasisregistraties.nl/blau/id/concept/buitenlands_adres> ; void:feature <http://www.w3.org/ns/formats/turtle>, <http://www.w3.org/ns/formats/rdf_xml>, <http://www. w3.org/ns/formats/n-triples> ; void:properties 38 ; void:triples 17950 ; void:uriregexpattern ^http://data\\.stelselvanbasisregistraties\\.nl/(.+)/id/(gegevenselement concept basisregistratie)/(.*)$ ; void:vocabulary void:, olca:, foaf:, skos:, dc:, <http://data.stelselvanbasisregistraties.nl/stelselcatalogus/def#>, dcterms:, prov: ; prov:generatedattime 2013-08-23T17:46:16.015+02:00 ^^xsd:datetime ; prov:wasgeneratedby <http://data.stelselvanbasisregistraties.nl/stelselcatalogus/id/activity/exportfromtbc> 24
5.1.13 VOOR HET BESCHRIJVEN VAN DE HERKOMST VAN DE DATA: PROV Herkomst ( provenance in het Engels) is de verzamelnaam om aan te duiden hoe data zijn aangemaakt (door wie, wanneer, met welke tools, ). Documentatie: http://www.w3.org/tr/prov-o/ Metadata: http://lov.okfn.org/dataset/lov/details/vocabulary_prov.html URL: <http://www.w3.org/ns/prov#> Klasse Activity : Voorbeeld: <http://www.opendataforum.be/news/14-juni-2013- open-data-dag-in-vlaanderen> rdf:type prov:entity <http://www.opendataforum.be/news/14-juni-2013- open-data-dag-in-vlaanderen> prov:wasattributedto <http://data.vlaanderen.be/persoon/a123#id> <http://www.opendataforum.be/news/14-juni-2013- open-data-dag-in-vlaanderen> prov:wasgeneratedby <http://data.vlaanderen.be/creatieevent/ E20132876#id> <http://data.vlaanderen.be/creatieevent/e20132876#id> rdf:type prov:create <http://data.vlaanderen.be/creatieevent/e20132876#id> prov:endedattime 2013-05-03T08:53:00 ^^xsd:datetime <http://data.vlaanderen.be/creatieevent/e20132876#id> prov:wasassociatedwith <http://data.vlaanderen.be/persoon/a123#id> 25
5.2 EEN EIGEN VOCABULARIUM MAKEN (EIGEN KLASSEN EN PROPERTIES) Het is best mogelijk dat de bestaande vocabularia niet of niet helemaal of niet juist uw domein beschrijven. Dan is het natuurlijk mogelijk om zelf klassen en properties/relaties te gaan definiëren. Het gesuggereerde URI patroon hiervoor: http://{domein}{/collection}*/def#{key} waarbij key: de naam van de klasse is (UpperCamelCase) de naam van de property (lowercamelcase) Voorbeelden: URI Patroon http://{domein}/def#{key} http://{domein}{/collection}*/def#{key} Voorbeeld http://toerisme.vlaanderen.be/def#hotel http://toerisme.vlaanderen.be/def#aantalkamers http://data.vlaanderen.be/toerisme/def#hotel http://data.vlaanderen.be/toerisme/def#aantalkamers Voor hoe die klassen en properties verder moeten getypeerd en gespecifieerd worden verwijzen wij naar het boek Semantic Web for the Working Ontologist (http://workingontologist.org/). 26
5.3 VALUE VOCABULARIES We hebben tot nu toe aan entititeiten identifiers toegekend, hebben aangeduid tot welke klasse(n) zij horen en welke properties en relaties zij hebben. In bepaalde is het handig om gecontroleerde lijsten van toegelaten waarden te hebben om de waarde aan properties en relaties toe te kennen. Zo n (controlled vocabularies) waardenlijstjes noemt men value vocabularies. Wij sommen hier een aantal herbruikbare value vocabularia op: Inhoud tijdsfrequenties tijdsintervallen talen filetypes landen currencies Identifier http://dublincore.org/groups/collections/frequency/2013-06-26/freq.rdf# http://reference.data.gov.uk/def/intervals http://publications.europa.eu/mdr/resource/authority/language/skos/languages-skos.rdf http://publications.europa.eu/mdr/resource/authority/file-type/skos/filetypes-skos.rdf http://publications.europa.eu/mdr/resource/authority/country/skos/countries-skos.rdf http://publications.europa.eu/mdr/resource/authority/currency/skos/currencies-skos.rdf Opmerking: de controlled vocabularies beheerd door het publications office van de Europese Unie komen pas in de loop van 2014 ter beschikking in de LOD cloud. Een voorbeeld: Voor het aanduiden van tijdsfrequenties kunnen we het volgend controlled vocabularium gebruiken http://dublincore.org/groups/collections/frequency/2013-06-26/freq.rdf#. Deze somt de voorziene en toegelaten waarden op: identifier freq:annual freq:biennial freq:bimonthly freq:biweekly freq:continuous freq:daily freq:irregular freq:monthly freq:quarterly freq:semiannual freq:semimonthly freq:semiweekly freq:threetimesamonth freq:threetimesaweek freq:threetimesayear freq:triennial freq:weekly label Annual Biennial Bimonthly Biweekly Continuous Daily Irregular Monthly Quarterly Semiannual Semimonthly Semiweekly Three times a month Three times a week Three times a year Triennial Weekly Dit wordt dan als volgt gebruikt b.v. bij de property accrualperiodicity uit het Dublin Core vocabularium. <http://data.vlaanderen.be/dataset/entiteiten#id> dct:accrualperiodicity freq:quarterly In 2014 voorziet de Open Data team van de Vlaamse Overheid heel wat eigen Vlaamse controlled vocabularia te publiceren (lijst van entiteiten, lijst van gebouwen, lijst van beleidsdomeinen,.) met bijhorende reconciliatie service zodat het makkelijk is om op basis van een label de bijhorende identifier op te vragen. 27
6 BESLUIT Om zo éénduidig mogelijk te zijn werken wij met identifiers, meer bepaald URL s. Individuen krijgen zo n identifier, maar ook de klassen waartoe zij behoren en de properties om hen te beschrijven. Dit document beschreef de richtlijnen voor het munten van deze URL s voor die dingen waarvan wij zelf de (authentieke) bron zijn. Voor klassen en properties kan men de url s gebruiken van al bestaande vocabularia, waarvan wij de meest gebruikte hebben aangehaald. Wil men zelf klassen en properties definiëren dan hebben we ook daarvoor een richtlijn aangehaald. 6/ Besluit 28