Sintassi per RDF: RDF/XML

La sintassi utilizzata da RDF per codificare il modello a grafi è basata su XML ed è chiamata RDF/XML.
Vediamone subito un esempio. La sintassi RDF corrispondente al grafo

Esempio grafo RDF

Esempio grafo RDF per la frase "Questo blog è scritto da Simone Dezaiacomo"

è la seguente:

1. <?xml version="1.0"?>
2. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
3.             xmlns:dc="http://purl.org/dc/elements/1.1/">
4.   <rdf:Description rdf:about="https://semanticweb30.wordpress.com">
5.       <dc:creator>Simone Dezaiacomo</dc:creator>
6.   </rdf:Description>
7. </rdf:RDF>

Vediamone il significato riga per riga.

Riga 1:
è l’XML declaration, indica che il contenuto che segue è in formato XML e in quale versione.
Riga 2:
rdf:RDF, inidica che il contenuto XML che segue rappresenta RDF.

xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#&#8221; , è una XML Namespace (xmlns) declaration, che specifica che tutti i tag con prefisso rdf: sono parte del namespace identificato dalla URIref riportata di seguito all’uguale.
Riga 3:
xmlns:dc=”http://purl.org/dc/elements/1.1/&#8221;, rappresenta un’altra XML Namespace declaration, questa volta per il prefisso dc:.

Queste prime 3 righe sono quindi necessarie per indicare che il contenuto è RDF/XML e per identificare i namespace che vengono usati.

Riga 4:
rdf:Description indica che da qui inizia appunto la descrizione della risorsa, che serve per identificare il soggetto della frase usando l’attributo rdf:about per specificare l’URIref del soggetto.

Riga 5:
Il tag <dc:creator></dc:creator> (in ci dc:creator è un QName) rappresenta il predicato della frase, al cui interno si trova l’oggetto (il valore literal “Simone Dezaiacomo“) che rappresenta il valore della proprietà creator.
Questo elemento è annidato all’elemento di descrizione della risorsa (riga 4), quindi indica che la proprietà descritta in <dc:creator>…</dc:creator> deve esere applicata alla risorsa identificata nell’attributo rdf:about della descrizione.

Righe 6 e 7:
Sono le chiusure dei rispettivi tag.

Per frasi multiple relative allo stesso soggetto il ragionamento sarà lo stesso, inserendo un blocco <rdf:Description>…</rdf:Description> per ogni frase da rappresentare.
E’ anche possibile rappresentare le frasi multiple in maniera abbreviata, annidandole allo stesso elemento rdf:Description; questo è corretto in quanto si riferiscono allo stesso soggetto identificato dal valore di rdf:about.
In questo modo il grafo seguente

Grafo RDF frasi multiple sullo stesso soggetto

Grafo RDF con frasi multiple

verrebbe scritto come:

1. <?xml version="1.0"?>
2. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
3.             xmlns:dc="http://purl.org/dc/elements/1.1/">
4.   <rdf:Description rdf:about="https://semanticweb30.wordpress.com">
5.       <dc:creator>Simone Dezaiacomo</dc:creator>
6.       <dc:language>IT</dc:language>
7.       <dc:contributor rdf:resource="http://www.example.org/exblogger/
               1123"/>
8.   </rdf:Description>
9. </rdf:RDF>

Blank Nodes
Questa sintassi da la possibilità di rappresentare anche grafi contenenti nodi che non possiedono URIref, e i quali sono descritti in termini di altre informazioni. Questo tipo di nodo è detto blank node.
I blank nodes, oltre che essere un valido metodo per evitare di identificare una risorsa tramite un literal a causa della mancanza di una URIref, sono anche utilizzati quando bisogna rappresentare un’informazione che per essere descritta necessita di essere suddivisa nelle sue sotto-componenti (ad esempio se la risorsa è un indirizzo, le sue componenti possono essere Via,numero civico, città). RDF gestisce solo relazioni binarie, quindi una relazione n-aria tra un soggetto ed un gruppo di componenti separate deve essere ricondotta a una relazione binaria tra il soggetto ed il blank node, le cui proprietà rappresenterano le componenti della proprietà n-aria. Il blank node diventa quindi un nodo intermedio che non ha bisogno di essere raggiunto direttamente dall’esterno del grafo.
Un metodo per rappresentare i blank nodes è quello di assegnargli un blank node identifier, che serve per identificarlo univocamente all’interno di un documento RDF ma che è sconosciuto al di fuori del documento.
Nella rappresentazione a triple, la forma di un blank node identifier è la seguente:
_:nomeRisorsa
In RDF/XML si usa un attributo rdf:nodeID il cui valore sarà il blank node identifier.
Se in una frase il soggetto è un blank node, si usa l’elemento rdf:Description con l’attributo rdf:nodeID in sostituzione dell’attributo rdf:about; allo stesso modo una frase con un blank node come oggetto viene scritta usando un elemento con un attributo rdf:nodeID al posto di rdf:resource.

Typed Literals
Se in una frase RDF rappresentiamo l’età di un impiegato della azienda con un (plain) literal (ad es: 22), potremmo avere dei problemi poichè dalla frase stessa non si evince come debba essere interpretato questo valore (come un numero, o come i caratteri 2 e 2 concatenati). Delle applicazioni specifiche possono essere scritte in modo di essere in grado di interpretare i valori delle proprietà identificate con exterms:age come numeri decimali, ma in questo modo l’interpretazione corretta del grafo dipende dalle conoscenze disponibili all’applicazione, e non dal grafo RDF stesso.
Per fornire al grafo RDF questa informazione aggiuntiva si associa al literal un datatype (es: decimal, integer) che le applicazioni comprendono e quindi sanno come rappresentare. In RDF questi literals sono detti typed literals e sono formati da una coppia formata dalla stringa e da una URIref che identifica un datatype; il risultato è un singolo nodo literal nel grafico RDF con valore uguale alla coppia stringa+URIref:
“22”^^<http://www.w3.org/2001/XMLSchema#integer&gt;

Diversamente dai linguaggi di programmazione, RDF non ha datatype predefiniti; fornisce però un modo per indicare esplicitamente quale datatype deve essere usato per un certo literal: i datatype URIs. In questo modo RDF ha la flessibilità di rappresentare direttamente informazioni provenienti da sorgenti diverse senza il bisogno di conversioni. Un datatype è così formato:
– un insieme di valori (value space) che i literals rappresentano (le date)
– un insieme di stringhe (lexical space) che il datatype usa per rappresentare i valori (definisce quali caratteri sono validi per rappresentare i valori, es: 1999-08-16)
– un mapping lexical-to-value che determina il valore di un carattere dalle stringhe (2008-10-13 –> 13 Ottobre 2008)

In RDF/XML, un typed literal è rappresentato aggiungendo all’elemento che descrive la proprietà della risorsa, un attributo rdf:datatype, che specifica la URIref del datatype di riferimento.
Il contenuto dell’elemento dovrà essere scritto in modo appropriato al datatype che lo definisce. Il seguente codice

...
<rdf:Description rdf:about="http://www.example.org/index.html">
       <exterms:creation-date>August 16, 1999</exterms:creation-date>
</rdf:Description>
...

utilizzando i typed literal sarebbe:

...
<rdf:Description rdf:about="http://www.example.org/index.html">
     <exterms:creation-date rdf:datatype=
         "http://www.w3.org/2001/XMLSchema#date">1999-08-16
       </exterms:creation-date>
 </rdf:Description>
...

Opzionalmente, per motivi di leggibilità, potrebbe essere utile scrivere l’URIref del datatype come abbreviazione. In RDF/XML non è ammesso però utilizzare i QName come valori di attributi, quindi se vogliamo abbreviare l’URIref del datatype utilizzato nell’esempio precedente
http://www.w3.org/2001/XMLSchema#date&#8221;
è necessario dichiarare delle entità XML (come parte della dichiarazione del DOCTYPE all’inizio del documento RDF/XML) in modo da associare l’URIref del datatype ad una entità (nell’esempio l’entità sarà xsd):
<!DOCTYPE rdf:RDF [<!ENTITY xsd “http://www.w3.org/2001/XMLSchema#”>%5D&gt;
In questo modo sarà possibile scrivere l’URIref come valore di attributo nella forma:
&xsd;date

Identificare le risorse
Per identificare le risorse in RDF/XML, abbiamo visto che nella rdf:Description è possibile utilizzare l’attributo rdf:about che contiene come valore l’URIref della risorsa. Alternativamente è possibile sostituire l’attributo rdf:about con rdf:ID, il cui valore identifica un fragment identifier, come abbreviazione dell’URIref completa della risorsa. Il fragment identifier sarà interpretato in relazione all’URI principale del documento; l’URIref completa sarà formata prendendo l’URI principale e concatenandogli il carattere “#” seguito dal fragment identifier.

Esempio:
Per un documento RDF/XML identificato da
http://www.example.com/2002/04/products
un esempio di contenuto RDF/XML può essere:

...
<rdf:Description rdf:ID="item01245"> 
...

da cui possiamo ricavare:
URI principale: http://www.example.com/2002/04/products
fragment identifier: item10245
URIref completahttp://www.example.com/2002/04/products#item10245

Il valore dell’attributo rdf:ID deve essere univoco all’interno dell’URI per cui è definito.

Anche con questo metodo di identificazione della risorsa, è comunque possibile riferirsi ad essa dall’esterno del documento utilizzando l’URIref assoluta, mentre dall’interno del documento RDF/XML stesso sarà possibile farlo anche tramite l’URIref relativa #fragment_identifier

Negli esempi precedenti abbiamo supposto che l’URI principale da cui si partiva per identificare la risorsa con il fragment identifier fosse l’URI del documento RDF/XML che contiene la risorsa. Esiste però anche un modo per poter specificare un altro URI principale cui riferirsi al posto dell’URI del documento stesso; questo metodo si basa sull’XML Base.
Si usa quindi una dichiarazione xml:base, all’interno della dichiarazione del documento RDF, il cui valore specifica l’URI principale alternativo.
xml:base=”http://mirror.example.com/2002/04/products&#8221;
In questo modo, tutte le URIref relative utilizzate nel documento dovranno far riferimento all’URI principale indicato, indipendentemente dall’URI del documento.

Classi e categorie di elementi (Typed node elements)
Può essere utile in certi casi raggruppare gli elementi per categorie. Questo è possibile grazie alla proprietà rdf:type, il cui valore rappresenta una categoria (o classe) di elementi cui la risorsa che viene descritta appartiene (ne è una istanza).

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:exterms="http://www.example.com/terms/"
<rdf:Description rdf:ID="item10245">
     <rdf:type rdf:resource="http://www.example.com/terms/Tipo1"/>
...

Nella forma abbreviata, la proprietà rdf:type e il suo valore vengono rimossi, l’elemento rdf:Description viene sostituito da un elemento il cui nome è il QName corrispondente al valore del rdf:type rimosso. In questa forma l’esempio precedente diventa

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:exterms="http://www.example.com/terms/"

<exterms:Tipo1 rdf:ID="item10245">
...

Questa forma abbreviata, in caso di risorse rappresentabili come istanza di più classi, vale solo per una delle classi, le altre devono essere descritte nella forma estesa.

Fonti:
http://www.w3.org/TR/rdf-primer/

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: