RDF sta per Resource description framework e definisce un «linguaggio» per rappresentare informazioni relative a risorse disponibili nel web, allo scopo di realizzare ciò che è noto come «web semantico». Questo lavoro ha origine nel 1999 e i documenti che da allora si sono succeduti utilizzano una terminologia che cambia nel tempo, mano a mano che i concetti astratti originali trovano attuazioni concrete; pertanto, piuttosto che soffermarsi sulla terminologia, è meglio cercare di capire il senso dei vari componenti.
Anche se in relazione a RDF si parla di «linguaggio», in pratica si tratta di un modo di schematizzare le informazioni; tali schemi vengono poi resi in forma testuale in modi diversi, a seconda della necessità o dell'opportunità.
Prima è nato il «web», poi sono nati i motori di ricerca, poi si è posto il problema di dare maggiori informazioni ai motori di ricerca per migliorare la classificazione dei file accessibili attraverso la rete e del loro contenuto. A tale proposito, nelle intestazioni delle pagine HTML sono stati usati gli elementi META, per esempio così:
|
Attualmente è preferibile inserire del codice RDF (per cui si parla di HTML+RDF, o di RDFa), trasformando quanto già mostrato nell'esempio seguente:
|
Come si vede, al posto degli attributi name ci sono attributi property, a cui si assegna un URI che definisce la proprietà dell'attributo content. In pratica, il documento rappresentato dalla pagina HTML che contiene questa intestazione ha il titolo «Il mio hobby preferito», in quanto la proprietà che lo definisce è espressa dall'URI http://purl.org/dc/terms/title
. Si osservi anche che in questo caso, al posto di indicare il nome dell'autrice (Clara Drusilla), si fa riferimento a un'altra pagina (clara.html
) che presumibilmente contiene delle informazioni personali più articolate.
Nel modello delle basi di dati relazionali, i dati sono organizzati in relazioni che si suddividono in tuple; ovvero, si tratta di tabelle suddivise in righe. RDF permette di arrivare alla descrizione di una base di dati che ha la forma di un grafo orientato, attraverso delle triple, ovvero terne di valori. Per la precisione, RDF descrive solo delle triple, con cui si costruisce un grafo più o meno articolato.
I tre componenti della tripla hanno dei nomi convenzionali che però possono creare confusione, perché non esprimono bene il significato che hanno in pratica: soggetto, predicato e oggetto. In alternativa, come si vede nell'esempio della figura, possono essere sostituiti risorsa, proprietà e valore.
Il soggetto, ovvero il primo elemento di una tripla, può essere solo un URI (uniform resource identifier) e lo scopo della tripla è quello di conoscere il valore di una proprietà di questo soggetto. In casi eccezionali, come viene descritto più avanti nel capitolo, il soggetto può essere rappresentato da un «nodo vuoto», privo di URI.
Il predicato, ovvero il secondo elemento della tripla è un URI che definisce qualcosa che riguarda il soggetto e che ha un valore. Questo URI fa parte di solito di un vocabolario, ovvero una raccolta di proprietà. Il verso della freccia che rappresenta la proprietà in una tripla è convenzionale: va sempre indirizzato verso l'oggetto, ovvero il terzo elemento.
L'oggetto, ovvero il terzo elemento della tripla è il valore della proprietà. Questo valore può essere costituito da un indirizzo URI, oppure da un dato costante, come una stringa, una data o un numero.
Va osservato che gli indirizzi URI, a cui ci si riferisce in questi casi, non sono necessariamente anche degli indirizzi URL. Pertanto, si tratta di indirizzi univoci, ma a questi indirizzi non fa capo necessariamente una risorsa che possa essere consultabile immediatamente. Va poi osservato anche che, nella realizzazione pratica di RDF, si vedono solo indirizzi che fanno capo al protocollo HTTP.
Un soggetto (il primo elemento di una tripla) può possedere diverse proprietà, ognuna delle quali si esprime con una tripla indipendente, come si vede nella figura successiva.
Da questo fatto si può incominciare a intravedere il grafo orientato che si può sviluppare attraverso le triple di RDF:
Quando un oggetto (il terzo elemento di una tripla) è costituito da un indirizzo URI, a sua volta questo può essere descritto ulteriormente, diventare soggetto di altre triple.
In presenza di soggetti e oggetti corrispondenti alla stessa risorsa, i grafi possono innestarsi:
Rispetto agli esempi mostrati, va aggiunto il fatto che la proprietà di un soggetto può apparire più volte, con valori diversi. Per esempio, per indicare più autori di uno stesso soggetto, si può usare la proprietà http://purl.org/dc/terms/creator
più volte.
Ciò che mette in relazione il soggetto con l'oggetto di una tripla (il primo e l'ultimo elemento), ovvero la proprietà, fa parte di un vocabolario. Negli esempi apparsi fino a questo punto, sono stati usati due vocabolari: http://purl.org/dc/terms/
e http://xmlns.com/foaf/0.1/
.
Di norma (ma non sempre), se si seguono gli indirizzi URI corrispondenti ai vocabolari rispettivi, attraverso un navigatore ipertestuale, si viene ridiretti alla guida sul loro utilizzo. In tal modo si può conoscere che significato dare a ogni «termine» da usare in qualità di proprietà di una tripla di RDF. Nel caso particolare degli esempi, si può osservare che il primo vocabolario è pensato per attribuire proprietà a ciò che rappresenta un prodotto editoriale (autore, titolo, data,...), mentre il secondo si presta per attribuire proprietà a ciò che rappresenta una persona (nome, indirizzo di posta elettronica, telefono, relazioni con altre persone,...).
|
I vocabolari possono essere costruiti utilizzando il linguaggio «RDF Schema» (da non confondere con http://schema.org/). Questo aspetto della definizione dei vocabolari viene omesso nel capitolo ed eventualmente va approfondito nella documentazione ufficiale del consorzio W3C: www.w3.org/TR/rdf-schema/.
Le risorse che si utilizzano nella costruzione delle triple, possono essere abbreviate. Per fare questo si possono dichiarare delle abbreviazioni come appare nella tabella precedente; per esempio, al posto di scrivere http://xmlns.com/foaf/0.1/phone
si scriverebbe foaf:phone
, intendendo la stessa cosa.
Anche le risorse che si vanno a descrivere possono essere indicate attraverso delle abbreviazioni, scelte opportunamente in modo da non creare confusione, come si vede nella figura successiva.
È importante osservare che i percorsi associati ai prefissi, devono essere indicati con attenzione. Per esempio, se il prefisso foaf
fosse stato indicato come http://xmlns.com/foaf/0.1
, senza la barra obliqua finale, l'indicazione della risorsa foaf:name
produrrebbe un risultato errato: http://xmlns.com/foaf/0.1name
al posto di http://xmlns.com/foaf/0.1/name
.
Va anche osservato che per poter usare i prefissi, occorre dichiararli espressamente, nella modalità prevista dal contesto in cui si applica il linguaggio RDF. Comunque, in relazione ai vocabolari di proprietà, è sempre bene fare riferimento ai prefissi usati comunemente.
Ci può essere la necessità o l'opportunità di utilizzare nodi «vuoti», nel senso che non sono identificati da un URI, ma sui quali si vogliono indicare delle proprietà. Per esempio, Clara Drusilla potrebbe voler annotare i dati di alcuni conoscenti nella sua pagina hobby.html
, come si vede nella figura successiva.
Anche se il nodo che si aggiunge non è rappresentato da un URI, occorre dargli un nome provvisorio, in modo da poterlo trattare. Convenzionalmente gli si attribuisce il prefisso di abbreviazione _
(trattino basso), a cui poi si aggiunge un nome qualunque, ma scelto opportunamente, come si vede nella figura. In pratica, in questo modo si definisce un URI inesistente, relativo a un prefisso non dichiarato.
Quando si dichiarano nodi vuoti, come descritto nella sezione precedente, può essere opportuno specificare che tipo di informazione rappresentano. Il «tipo» di un soggetto si definisce attraverso l'appartenenza a una «classe» secondo RDF. Le classi fanno parte della definizione dei vocabolari di proprietà e, convenzionalmente, i nomi delle classi iniziano con una lettera maiuscola, mentre i nomi delle proprietà hanno una iniziale minuscola.
Per dichiarare espressamente il tipo (la classe) di un soggetto, si usa la proprietà http://www.w3.org/1999/01/22-rdf-syntax-ns#type
. Nel caso dell'esempio apparso nell'ultima figura, si vede la dichiarazione di un nodo vuoto, relativo a una persona conosciuta da Clara Drusilla: dal momento che questo nodo appare come valore della proprietà http://xmlns.com/foaf/0.1/knows
si determina implicitamente che deve trattarsi di una persona, secondo la classe http://xmlns.com/foaf/0.1/Person
, ma lo si può rendere esplicito come si vede nella figura successiva.
La sigla RDFa sta per «RDF in attributes», ovvero una forma di traduzione del linguaggio RDF attraverso attributi SGML/XML. Si tratta in pratica della modalità più semplice di incorporare questo tipo di informazioni in pagine HTML.
Gli attributi del linguaggio RDFa possono essere collocati in qualunque elemento HTML; naturalmente la scelta va fatta in base ai contenuti che si intendono descrivere. All'inizio del capitolo appare un esempio di codice RDFa, con il quale si descrive la pagina http://www.claradrusilla.org/hobby.html
di Clara Drusilla:
|
Dal momento che le informazioni riguardano la pagina nel suo complesso, il codice RDFa viene inserito opportunamente nell'intestazione HTML. Si può vedere l'uso dell'attributo property, con il quale si indica la risorsa che identifica la proprietà, e l'uso dell'attributo content con il quale si specifica il valore della proprietà. Si osserva che il «soggetto» non viene dichiarato espressamente, pertanto si riferisce alla pagina stessa, ovvero http://www.claradrusilla.org/hobby.html
.
L'uso dell'attributo content si è reso necessario perché i valori delle proprietà non potevano essere contenuti diversamente: gli elementi META sono elementi vuoti. Supponendo che la pagina degli hobby di Clara Drusilla mostri parte di queste informazioni al lettore, sarebbe stato possibile organizzare gli attributi RDFa in maniera differente:
|
In tal modo, il titolo principale, la descrizione della pagina e la data di creazione sono stati presi dai contenuti degli elementi, senza bisogno di inserirli in attributi content.
Per dichiarare espressamente il «soggetto», ovvero la risorsa a cui si sta facendo riferimento, si può usare l'attributo resource. In questo caso viene collocata nell'elemento HTML, dato che si tratta effettivamente della pagina:
|
Supponendo che Clara Drusilla consenta di copiare la sua pagina in altri siti, ma preferisca che la risorsa a cui si fa riferimento sia sempre quella originale, l'indicazione potrebbe avvenire, opportunamente, in modo completo:
|
Logicamente, l'attributo resource diventa indispensabile quando ci si riferisce a qualcosa che è descritto in un file differente da quello in cui appare; per esempio in una bibliografia, dove si indicano dati editoriali riferiti a documenti esterni. Il campo di azione dell'attributo resource riguarda l'elemento in cui appare; pertanto appare frequentemente in elementi DIV e SPAN, all'interno dei quali si descrive la risorsa attraverso proprietà e valori.
Per evitare di dover indicare le proprietà attraverso percorsi completi, è possibile specificare il vocabolario RDF attraverso l'attributo vocab:
|
In questo caso, tutta la pagina utilizza un solo vocabolario, quindi l'attributo vocab è stato collocato nell'elemento HTML complessivo. A ogni modo, le eccezioni al vocabolario predefinito potrebbero essere trattate utilizzando dei percorsi completi, come nell'esempio seguente che si riferisce alla pagina clara.html
, nella quale Clara Drusilla mette i propri dati:
|
Quando si usa l'attributo vocab si crea però ambiguità in merito alla risorsa a cui si sta facendo riferimento; pertanto, anche se si tratta della stessa pagina, è bene specificare anche l'attributo resource, eventualmente vuoto se si vuole proprio la stessa pagina, senza dover sapere come si chiama o dove si colloca:
|
Con l'accortezza di specificare ogni volta anche la risorsa, è possibile dichiarare un vocabolario diverso nell'area che interessa. In questo caso si utilizza un elemento DIV per isolare la zona:
|
L'uso dell'attributo vocab consente di non doversi avvalere di abbreviazioni; tuttavia si può fare anche questo, con l'attributo prefix:
|
Quando si presenta la necessità o l'opportunità di specificare la classe (il tipo) di appartenenza della risorsa a cui si fa riferimento, si può utilizzare l'attributo typeof, senza bisogno di indicare la proprietà http://www.w3.org/1999/01/22-rdf-syntax-ns#type
. Anche in occasione dell'uso dell'attributo typeof è bene precisare la risorsa a cui ci si riferisce, altrimenti si rischia di far intendere che si tratti di un nodo vuoto:
|
Nell'esempio si vede che nell'area controllata dall'elemento DIV, le proprietà si riferiscono a una risorsa di tipo Person
. Per la precisione, la classe che definisce il tipo è http://xmlns.com/foaf/0.1/Person
, essendo stato dichiarato il vocabolario poco prima:
Nell'esempio successivo si vede la creazione di un nodo vuoto in relazione all'indicazione di un conoscente di Clara Drusilla:
|
In questo caso, supponendo che prima del codice mostrato si stesse facendo riferimento alla risorsa http://www.claradrusilla.org/clara.html
, si intende che questa risorsa «conosce» un nodo vuoto, di tipo http://xmlns.com/foaf/0.1/Person
, il quale ha il nome e l'indirizzo di posta elettronica delimitati con elementi SPAN appositi:
N-Triples è una modalità di rappresentazione molto semplice delle triple RDF; si tratta di righe contenenti i tre elementi consueti: soggetto, predicato e complemento, con la particolarità che si usano le parentesi uncinate, < e >, per delimitare soggetto, predicato ed eventualmente anche l'oggetto quanto questo non è espresso in forma costante. L'esempio seguente mostra la trasformazione di un grafo RDF in N-Triples:
|
Le righe che compongono le triple, possono essere spezzate, proprio come si vede nell'esempio: in ogni caso, il punto fermo finale determina la conclusione della riga.
I nodi vuoti vengono dichiarati espressamente, attraverso una notazione del tipo _:nome. L'esempio seguente traduce il grafo visibile dalla forma grafica alla forma N-Triples:
|
Si osservi che i valori costanti appaiono sempre delimitati come stringhe: per poter specificare il linguaggio o indicare che si tratta invece di valori diversi (per esempio numerici), occorre aggiungere un'estensione. Si veda eventualmente la documentazione elencata alla fine del capitolo.
Turtle sta per terse RDF triple language e corrisponde a una modalità di rappresentare il linguaggio RDF in forma testuale, in modo più compatto rispetto a N-Triples. Di fatto, Turtle è un'estensione di N-Triples. Viene ripreso il primo esempio mostrato a proposito di N-Triples, il quale è valido anche per Turtle:
|
Con Turtle si possono però annotare dei prefissi, così come si può fare con RDFa. L'esempio appena mostrato si potrebbe semplificare nel modo seguente, dopo aver dichiarato i prefissi clara
e dcterms
:
|
Al posto del prefisso è possibile indicare risorse con percorsi relativi:
|
Quando un gruppo di triple condivide lo stesso soggetto, è possibile semplificarle usando il punto e virgola, come si vede nella variante successiva:
|
Se un gruppo di triple condivide lo stesso soggetto e lo stesso predicato, è possibile semplificarle usando la virgola, come si vede nella variante successiva, dove si immagine di avere due descrizioni alternative per la pagina degli hobby della professoressa Clara Drusilla:
|
I nodi vuoti vengono annotati nello stesso modo già visto a proposito di N-Triples, ma con le estensioni di Turtle:
|
Con Turtle si può rimpiazzare la proprietà http://www.w3.org/1999/01/22-rdf-syntax-ns#type
con la sigla a:
|
Network Working Group, RFC 3987: Internationalized Resource Identifiers (IRIs), 2005, http://www.ietf.org/rfc/rfc3987.txt
W3C, RDF, 2004, http://www.w3.org/TR/rdf-syntax/, http://www.w3.org/TR/rdf-concepts/, http://www.w3.org/TR/rdf-syntax-grammar/, http://www.w3.org/TR/rdf-mt/, http://www.w3.org/TR/rdf-schema/, http://www.w3.org/TR/rdf-testcases/
W3C, RDFa, 2012, http://www.w3.org/TR/rdfa-primer/, http://www.w3.org/TR/rdfa-core/, http://www.w3.org/TR/rdfa-lite/, http://www.w3.org/TR/rdfa-in-html/, http://www.w3.org/TR/xhtml-rdfa/
W3C, Turtle, http://www.w3.org/TR/turtle/
W3C, RDFa validator, http://www.w3.org/2012/pyRdfa/Validator.html
RDF:about, RDF validator and converter, http://www.rdfabout.com/demo/validator/
W3C, SPARQL, http://www.w3.org/TR/rdf-sparql-query/, http://www.w3.org/TR/sparql11-query/
«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net