Hopp til hovudinnhald

Kræsjkurs i Resource Description Framework (RDF)

Om du ikkje allereie har lese den, ta gjerne ein titt på artikkelen om kvifor data.norge.no bruker RDF, der får du ein overordna forklaring på kva RDF er.

Byggeklossane i RDF

Trippelet

I RDF kan vi koma med utsegner, eller fakta om ressursar, og desse utsagnene er alltid i same form:

<subjekt> <predikat> <objekt>

Subjektet og objektet er ressursane vi seier noko om, medan predikatet seier noko om relasjonen mellom subjektet og objektet. Nokre døme på tripler (i pseudokode) er:

  • <Leonardo da Vinci> <ble født> <15. april 1452>
  • <Leonardo da Vinci> <var> <en malar>
  • <Mona Lisa> <er malt av> <Leonardo da Vinci>

Slik sett er datamodellen i RDF veldig enkel: all data består berre av ein samling av slike tripler.

Merk: Sidan eit trippel definerer ein relasjon mellom subjektet og objektet, utgjer ein samling av tripler ein graf, som illustrert i figuren under. Vi kan bruke uttrykket RDF-graf som synonym for "ein samling med tripler".

Ein RDF-graf, som viser nokre utsegner om Leonardo da Vinci

Ressursar treng eit namn: URI

Når vi skal beskrive ein ressurs i RDF er vi nøydde til å vita kva ressurs det er snakk om, og difor gir vi ressursar namn i form av ein URI. http://dbpedia.org/resource/Leonardo_da_Vinci er eit døme på ein slik URI, som peikar til ressursen "Leonardo da Vinci" hos DBpedia.

Ein URI, eller Unique Resource Identifier, er ein global og unik identifikator, og dette er grunnen til at ein bruker URI-ar for å namnsetja ressursar i RDF: då kan kven som helst, kvar som helst bruke URI-en og vita at dei snakkar om same ting. Dette skil seg for eksempel frå typiske ID-ar i databasesystem, eller gateadresser som er unike berre innanfor ein kommune.

Merk: Det kan iblant vere tvitydig om ein URI peikar til beskrivinga av tingen eller tingen i seg sjølv. For eksempel ville det vore rart å seie at DBpedia-sida om Leonardo da Vinci er Leonardo da Vinci sjølv. Likevel er dette eit vanleg mønster å følgje i RDF, særleg når det gjeld beskrivingar av personar. Når det gjeld datasettbeskrivingar er praksis derimot at URI-en til ein instans av dcat:Dataset peikar til datasettbeskrivinga og ikkje den fysiske førekoma av datasettet.

Verdier ("literals")

I tillegg til URI-ar kan ei beskriving i RDF bestå av verdiar som mellom anna tekst, tal eller datoar. Desse kallast "literals" i RDF.

Tips: Du kan òg angi kva språk ein tekst er på, for eksempel slik "tekst på bokmål"@nb.

Modellere Ada Lovelace

La oss vise med eit litt større døme kor vi har nokre påstandar, eller utsegner, om personen Ada Lovelace:

<AdaLovelace> <er av type> <Person> <AdaLovelace> <har namn> <Ada Lovelace> <AdaLovelace> <fødd> <10.12.1815> <AdaLovelace> <kjenner> <CharlesBabbage> <AdaLovelace> <har interesse> <Programmering>

Det kan vi òg teikne opp som denne grafen:

Graf som inneholder utsagn om Ada Lovelace

Dette vil vi no verta skrive i eit gyldig RDF-format kalla Turtle (eller "serialiseringsformat" for å vera heilt presis).

Turtle - eit RDF-format

Turtle er eit konkret språk for å lage RDF-grafer. Kort oppsummert:

  • Du skriv ein URI med "<" og ">", slik: <https://example.org>
  • Du skriv tekstverdier med anførselstegn: "en tekst"
  • Du kan angi typen til ein verdi, for eksempel heiltal: "1"^^<http://www.w3.org/2001/XMLSchema#integer>, eller dato: "2024-06-05"^^<http://www.w3.org/2001/XMLSchema#date>
  • Du kan angi språket til teksten: "An english text"@en eller "Ei tekst på nynorsk"@nn.

Døme

Vi bruker ressursar som allereie er definerte av andre, som RDF-navnerommet, Schema.org eller Friend of a friend (FOAF). Dette er kjende vokabularar, så alle system som baserer seg på desse vokabularane, vil då vera betre i stand til å forstå beskrivinga vår av Ada Lovelace.

Beskrivinga ser slik ut i Turtle:

<https://example.org/people/adaLovelace> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . <https://example.org/people/adaLovelace> <http://xmlns.com/foaf/0.1/name> "Ada Lovelace" . <https://example.org/people/adaLovelace> <https://schema.org/birthDate> "1815-12-10"^^<http://www.w3.org/2001/XMLSchema#date> . <https://example.org/people/adaLovelace> <https://schema.org/knows> <https://example.org/people/charlesBabbage> . <https://example.org/people/adaLovelace> <https://schema.org/knowsAbout> "programmering"@nb .

Prefiksar/navnerom

Med prefiksar (forkortingar) kan vi erstatta URL-ane med prefiksen vi har definert. For eksempel kan vi skrive foaf i staden for <http://xmlns.com/foaf/0.1/>.

Og om vi vil bruke eigenskapen "namn", <http://xmlns.com/foaf/0.1/name> treng vi berre å skrive foaf:name.

Her er nokre kjende og ofte brukte navnerom (i tillegg til eit eigendefinert, meint for døma på denne sida):

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix dct: <http://purl.org/dc/terms/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix schema: <https://schema.org/> . # Eigendefinert prefiks for døma her: @prefix people: <https://example.org/people/> .

...forenkla beskriving

Med prefiksa kan vi forenkla beskrivinga av Ada Lovelace

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix schema: <https://schema.org/> . @prefix people: <https://example.org/people/> . people:adaLovelace rdf:type foaf:Person . people:adaLovelace foaf:name "Ada Lovelace" . people:adaLovelace schema:birthDate "1815-12-10"^^xsd:date . people:adaLovelace schema:knows people:charlesBabbage . people:adaLovelace schema:knowsAbout "Programmering"@nb .

I staden for å skrive heile URI-en <https://example.org/people/adaLovelace> kan vi no skrive berre people:adaLovelace.

Men dette er berre ein syntaktisk snarveg for å skrive URI-en, og det er framleis på forma subjekt, predikat, objekt.

... endå meir forenkla

Når vi gjentar subjektet kan det skrivast om til

people:adaLovelace rdf:type foaf:Person ; foaf:name "Ada Lovelace" ; schema:birthDate "1815-12-10"^^xsd:date ; schema:knows people:charlesBabbage ; schema:knowsAbout "Programmering"@nb .

Kvart utsagn som gjenbrukar subjektet avsluttes med ;. Vi avslutter heile blokka med . som vanleg.

Med fleire verdiar på same predikat

Tips: Du kan legge inn kommentarar i Turtle med teiknet '#'. Då vert det som er bak '#'-teiknet ignorert.

people:adaLovelace rdf:type foaf:Person ; # ... kommentert vekk schema:knowsAbout "litteratur"@nb ; schema:knowsAbout "matematikk"@nb ; schema:knowsAbout "programmering"@nb .

Når vi gjenbrukar [ subjekt predikat ] kan vi skriva det om til

people:adaLovelace rdf:type foaf:Person ; # ... kommentert vekk schema:knowsAbout "musikk"@nb , "matematikk"@nb , "programmering"@nb .

Kvart utsagn som gjenbrukar [ subjekt predikat ] avsluttes med eit komma ,.

Resultat

I Turtle kan vi då gå frå den første beskrivelsen som består av eksplisitte tripplar, til ein meir forkorta og menneskelesbar versjon.

Utgangspunkt

<https://example.org/people/adaLovelace> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . <https://example.org/people/adaLovelace> <http://xmlns.com/foaf/0.1/name> "Ada Lovelace" . <https://example.org/people/adaLovelace> <https://schema.org/birthDate> "1815-12-10"^^<http://www.w3.org/2001/XMLSchema#date> . <https://example.org/people/adaLovelace> <https://schema.org/knows> <https://example.org/people/charlesBabbage> . <https://example.org/people/adaLovelace> <https://schema.org/knowsAbout> "musikk"@nb . <https://example.org/people/adaLovelace> <https://schema.org/knowsAbout> "matematikk"@nb . <https://example.org/people/adaLovelace> <https://schema.org/knowsAbout> "programmering"@nb .

Forkorta

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix schema: <https://schema.org/> . @prefix people: <https://example.org/people/> . people:adaLovelace rdf:type foaf:Person ; foaf:name "Ada Lovelace" ; schema:birthDate "1815-12-10"^^xsd:date ; schema:knows people:charlesBabbage ; schema:knowsAbout "musikk"@nb , "matematikk"@nb , "programmering"@nb .

Begge variantar er gyldig Turtle, og begge to representerer akkurat den same informasjonen. I botn er det tripplar beståande av URI-ar og verdiar.

a = rdf:type

Sidan vi ofte bruker predikatet rdf:type tilbyr Turtle forkortelsen a. Så dette tripplet:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix people: <https://example.org/people/> . people:adaLovelace rdf:type foaf:Person .

er det same som:

@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix people: <https://example.org/people/> . people:adaLovelace a foaf:Person .

Legg merke til at vi då ikkje treng å definere rdf-prefikset.

Blanke noder (ressursar utan URI)

I nokre tilfeller har vi ressursar som vi ikkje ønskjer eller treng å gi ein eksplisitt URI, fordi vi har vurdert at ressursen ikkje treng å pekast til andre stader. Då kan vi uttrykkje dei som såkalla blanke noder, eller ressursar utan identifikator.

I Ada Lovelace-eksempelet ønskjer vi å oppgi namna til Lovelace sine barn, Byron, Anna Isabella og Ralph Gordon, men vi vil ikkje lage nye URI-ar for dei. Då kan vi lage blanke noder ved hjelp av hakeparentesar [ og ], og oppgi namna innanfor hakeparentesane.

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix schema: <https://schema.org/> . @prefix people: <https://example.org/people/> . people:adaLovelace a foaf:Person ; # ...kommentert vekk schema:children [ a foaf:Person ; foaf:name "Byron" ; ] , [ a foaf:Person ; foaf:name "Anna Isabella" ; ] , [ a foaf:Person ; foaf:name "Ralph Gordon" ; ] .

Dette er framleis tripplar som før, men ressursen har ingen URI.

RDF-serialiseringar/syntaksar

Det finst fleire ulike måtar å uttrykkje RDF-grafer på. I tabellen under har vi lista nokre av dei vanlegaste syntaksane for å serialisere RDF.

RDF-verktøy og bibliotek kan lese frå og skrive til ein eller fleire av desse syntaksane. De facto standard er RDF/XML, men Turtle vert òg støtta av dei aller fleste verktøy.

NavnMediatypeFile extension
Turtletext/turtle.ttl
RDF/XMLapplication/rdf+xml.rdf
JSON-LDapplication/ld+json.jsonld
N-Triplesapplication/n-triples.nt
N-Quadsapplication/n-quads.nq
TriGapplication/trig.trig
Notation3text/n3;charset=utf-8.n3

Eksterne ressursar

Delar av denne teksten er basert på W3C sin RDF 1.1 Primer, ein ypperleg ressurs som er verdt å lese.