RDF e Web Semantico attraverso N3: introduzione

Questa è una traduzione in italiano dell'unica versione ufficiale del documento che è la versione originale in inglese Primer: Getting into RDF & Semantic Web using N3 di Tim Berners-Lee. I possibili errori dovuti alla traduzione, sono di esclusiva responsabilità del traduttore Pasquale Popolizio e non sono in alcun modo imputabili al W3C. Questa traduzione è stata realizzata nel giugno del 2005. Per qualsiasi commento riguardo tale traduzione rivolgersi a Pasquale Popolizio.

Il mondo del Web Semantico, basato sull'RDF, è, alla base, veramente semplice. Questo articolo mostra come cominciare. Usa un linguaggio semplificato - Notation 3 o N3 - che è essenzialmente equivalente all'RDF nella sua sintassi XML, ma più semplice da abbozzare quando si comincia.

Soggetto, verbo e oggetto

In RDF, l'informazione è semplicemente un insieme di dichiarazioni, ognuna con un soggetto, verbo e oggetto - e nient altro. In N3, puoi scrivere una tripla RDF proprio così, con un punto;

<#gennaro> <#conosce> <#ciro> .

Ogni cosa, sia essa il soggeto, il verbo o l'oggetto, viene identificato con un Uniform Resource Identifier. Questo è qualcosa come <http://www.w3.org/> o <http://www.w3.org/2000/10/swap/test/s1.n3#includes>, ma quando viene eliminato quello che viene prima di "#", esso identifica <#gennaro> dovunque nel documento.

Esiste una sola eccezione: l'oggetto (solo l'oggetto) può essere un letterale, come una stringa o un numero intero:

<#gennaro> <#conosce> <#ciro> .
<#gennaro> <#anni> 24 .

Il verbo "conosce", in RDF viene chiamato "proprietà" ed è un nome che esprime una relazione. Infatti, si può scrivere

<#gennaro> <#figlio> <#stefano> .

o, in alternativa, per renderla più leggibile

<#gennaro> has <#figlio> <#stefano> .

oppure

<#stefano> è <#figlio> di <#gennaro> .

Esistono due scorciatoie da utilizzare quando vi sono diverse dichiarazioni in relazione allo stesso soggetto: un punto e virgola ";" introduce un'altra proprietà dello stesso soggetto, e una virgola introduce un altro oggetto con lo stesso predicato e soggetto.

<#gennaro> <#figlio>  <#stefano>, <#ciro>, <#francesca> ;
       <#anni>    24 ;
       <#coloreocchi> "blu" .

Così, per esempio, i dati nella tabella

anni coloreocchi
gennaro 24 blu
stefano 3 verdi
ciro 5 verdi

potrebbe ssere scritto

  <#gennaro>   <#anni> 24;  <#coloreocchi> "blu" .
  <#stefano>    <#anni>  3;  <#coloreocchi> "verde" .
  <#ciro>    <#anni>  5;  <#coloreocchi> "verde" .

A volte possono esserci cose implicate in una dichiarazione che non possiedono un identificatore - magari questo esiste ma si vuole solo dare la proprietà. E' possibile rappresentare ciò con parentesi quadre con all'interno le proprietà.

<#gennaro> <#figlio> [ <#anni> 4 ] , [ <#et> 3 ].

Si può leggere come #gennaro ha un #figlio che ha #anni "4" e un #figlio che ha #anni "3". Ci sono due cose importanti da ricordare

  • Gli identificatori sono solo identificatori - il fatto che sono usate le lettere g e n n a r o non dice a nessuno e a nessuna macchina che si sta parlando di qualcuno il cui nome è "Gennaro" - finché non si dice <#gennaro> <#nome> "gennaro". Lo stesso vale per i verbi - niente dice cosa significano le lettere f i g l i o - lo scopriremo in seguito.
  • Le parentesi quadre dichiarano che esiste qualche cosa con la data priorità, ma non ti danno un riferimento verso qualcosa o verso un altro documento

Se vuoi usare un nome, la tabella precedente si potrebbe scrivere

  [ <#nome> "gennaro"; <#anni> 24;  <#coloreocchi> "blu"  ].
  [ <#nome> "stefano" ; <#anni>  3;  <#coloreocchi> "verde" ].
  [ <#nome> "gianno" ; <#anni>  5;  <#coloreocchi> "verde" ].

Esistono molti modi di combinare le parentesi quadre - e vedremo in seguito alcuni esempi. Non c'è molto ancora da imparare sull'uso di N3 per esprimere dati, così andiamo avanti.

Condividere i concetti

Il Web Semantico non può definire in un documento cosa significhi un qualcosa. Questo è possibile in Italiano (o a volte in matematica) ma quando noi comunichiamo usando il concetto "titolo", (come in una scheda della Biblioteca del Congresso o in una pagina Web), confidiamo sul concetto condiviso di "titolo". Sul Web Semantico, noi condividiamo usando esattamente lo stesso URI per il concetto di titolo.

Potrei tentare di dare il titolo di un documento N3 con

<> <#titolo>  "Un semplice esempio di N3".

(Dove <> è un riferimento ad un URI vuoto che si riferisce sempre al documento.) <#titolo> si riferisce al concetto di #titolo così come definito dallo stesso documento. Ciò non significa molto per il lettore. Comunque, un gruppo di persone ha creato un elenco di proprietà chiamato il Dublin Core, fra le quali c'è la loro idea di titolo, che essi danno all'identificatore

<http://purl.org/dc/elements/1.1/title>. Così possiamo realizzare una dichiarazione definita meglio, se diciamo

<> <http://purl.org/dc/elements/1.1/title>
 "Primer - Getting into the Semantic Web and RDF using N3".

Ciò è sicuramente un po' lungo - immaginate di utilizzare degli identificatori così lunghi per ogni cosa come per i precedenti #anni e #coloreocchi. L'N3 permette di fissare un prefisso come abbreviazione per la parte lunga - la parte che chiamiamo namespace. Si può fissarlo e dichiararlo utilizzando "@prefix" in questo modo:

@prefix dc:  <http://purl.org/dc/elements/1.1/> .
<> dc:title
  "Primer - Getting into the Semantic Web and RDF using N3".

Si noti che quando si usa un prefisso, si utilizzano i due punti invece di un cancelletto fra dc e title, e non si utilizzano le <parentesi angolari> intorno le cose. Ciò è molto semplice. E' come verranno scritti quasi tutti i predicati in N3. Una volta definito, un prefisso può essere utilizzato per tutto il documento.

Esiste un grande numero, sempre in aumento, di vocabolari RDF a cui poter fare riferimento - vedi l'home page di RDF ed è anche possibile costruirne il proprio per la propria applicazione in modo semplice.

Da questo momento, useremo alcuni namespece ben conosciuti e così, per salvare spazio, assumiamo i prefissi

@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:  <http://www.w3.org/2002/07/owl#> .

Questi sono i namespace rispettivamente di RDF, RDF schema e OWL. Essi ci danno i termini di base con i quali possiamo entrare nel Web Semantico. Sto anche per dichiarare che il prefisso vuoto è per il documento che stiamo scrivendo, e che possiamo scrivere in N3 come

@prefix : <#> .

Questo significa che potremmo avere l'esempio precedente come

:gennaro :figlio [ :anni 4 ] , [ :anni 3 ].

che è leggermente più breve da scrivere. Ora che sappiamo come scrivere i dati in N3, possiamo cominciare a scrivere i nostri propri vocabolari, in quanto essi sono proprio fatti di dati.

Realizzare i vocabolari

Cose come dc:title sono Proprietà di RDF. Quando si vuole definire un nuovo vocabolario, bisogna definire nuove classi di cose e nuove proprietà. Quando diciamo di qualcosa di che tipo di cosa è, definiamo una Classe a cui appartiene.

La proprietà che ci dice di che tipo è una cosa, è rdf:type che può essere abbreviata in N3 in a. In questo modo possiamo definire una classe di persona

:Person a rdfs:Class.

Nello stesso documento, possimo introdurre una persona

:gennaro a :Person.

Le classi ci raccontano la cosa che è in esse. Un oggetto può essere in molte classi. Non è necessario che ci sia una relazione gererchica - pensate a Persona, OggettoAnimato, Animale, PersonaAlta. Amico, e così via. Se esiste una relazione fra le classi, è possibile definirla - si confrontino le proprietà (di classi) nei vocabolari RDF Schema e OWL.

:Woman a rdfs:Class; rdfs:subClassOf :Person .

Una proprietà è qualcosa che viene usata per dichiarare una relazione fra due cose.

:sister a rdf:Property.

A volte, quando esiste una relazione fra due cose, immediatamente si conosce qualcosa su di loro, e quel qualcosa può essere espresso come una classe. Quando il soggetto di ogni proprietà deve essere in una classe, quella classe rappresenta un dominio della proprietà. Quando l'oggetto deve essere in una classe, quella classe rappresenta la gamma (range) di una proprietà. Una proprietà può evere molti domain e range, anche se in genere se ne specifica uno.

:sister rdfs:domain :Person; 
        rdfs:range :Woman.

Si noti che gli identificatori di classe cominciano con le maiuscole mentre le proprietà con lettere minuscole. Questo non rappresenta una regola, ma certamente un buona pratica. Si noti anche che poiché il domain di rdfs:range e rdfs:domain è rdf:Property, ne consegue che :sister è una rdf:Property, anche se non viene esplicitamente dichiarato.

Equivalenza

Spesso, si defisce un vocabolario dove uno o più dei termini, è, nei fatti, esattamente lo stesso di un altro vocabolario. Ciò rappresenta un utilissimo spunto di informazione per ogni macchina o persona che si interessa di quell'informazione! La proprietà di equivalenza fra due termini è così utile e fondamentale, che N3 ha un'abbreviazione speciale per essa, "=".

:Woman = foo:FemaleAdult .
:Title a rdf:Property; = dc:title .

Importante: usare vocabolari di altre persone laddove è possibile - ciò aiuta allo scambio di dati. Quando si definisce un proprio vocabolario che include sinonimi, fare anche registrazioni dei sinonimi, in quanto ciò potrà aiutare gli attuali e futuri processori a processare i propri ed altrui dati in modo significativo.

Scegli un namespace e pubblica il tuo vocabolario

Una buona documentazione disponibile on-line per i termini del vocabolario aiuta le persone a leggere e scrivere dati in RDF. Coloro che scrivono hanno bisogno di vedere come un termine viene usato; i lettori hanno bisogno di vedere cosa si suppone che significhi. Coloro che sviluppano software che usano i termini hanno bisogno di conoscere in particolare dettaglio cosa significa ogni URI.

Se si documenta il proprio vocabolario utilizzando i vocabolari RDF Schema e OWL, tale documentazione sarà leggibile dalle macchine in una varietà di modi interessanti ed utili, così come notato prima e come descritto in maggiore dettaglio in Vocabulary Documentation. Questo tipo di documentazione RDF realizzata in RDF è molte volte chiamata "schema" o "ontologia".

Il modo più semplice di aiutare le persone con la documentazione è di rendere gli URI che vengono creati come vocabolari, anche suscettibili di essere utilizzati da browser Web. Ciò accade automaticamente se viene seguita la convenzione dei nomi che abbiamo utilizzato qui, dove un documento che definisce un vocabolario ha un URI come http://example.com/terms e esso riferisce ai suoi termini come <#Woman>. Con la dichiarazione di @prefix precedente, ciò porta all'URI http://example.com/terms#Woman che dovrebbe funzionare in ogni browser per mostrare il documento di definizione.

In ipotesi, si dovrebbe pubblicare il proprio documento sul Web usando un server e porzioni di spazio di URI che sono possedute da organizzazioni che accettano di mantenerlo in futuro. In questo modo, dopo molti anni, i dati RDF che usano quei termini saranno ancora documentati e potenzialmente riconoscibili. La convenzione di inserire l'anno corrente nell'URI può aiutare con la stabilità; un bel giorno qualcuno potrebbe provare a riutilizzare http://example.com/food-vocabulary, ma questi probabilmente accederà solo a http://example.com/2003/food-vocabulary. In alcune circostanze, è possibile ottenere maggiore stabilità utilizzando un nome di dominio specializzato che è difficile rinominare

Naturalmente, se si svolgono solo delle prove, è possibile utilizzare un file (diciamo miodatabase.n3) nella stessa directory degli altri documenti. Allorquando si utilizza questa tecnica, è necessario utilizzare l'identificatore di namespace <miodatabase.n3#> poiché in N3 (come in HTML), gli URI possono essere specificati anche in modo relativo.

Ed inoltre...

Ora possiedi le nozioni per cominciare a creare i tuoi vocabolari o ontologie, e possiedi informazioni per recuperare ulteriori risorse. Non hai bisogno di cercare oltre, poiché quello che sai ti permetterà di creare nuove applicazioni, e creare schemi, file di dati, e programmi che scambiano e gestiscono dati per il Web Semantico.

A questo punto, dovresti poter cominciare a padroneggiare la materia. Per darti maggiori idee, è disponibile un elenco di ulteriori esempi complessi e vari.. Tali esempi sono commentati con spiegazioni.

Oppure, puoi continuare con un tutorial che va più a fondo nelle caretteristiche del linguaggio, spiegando come processare i tuoi ed altri dati sul Web. In questo caso, vai al documento: Shortcuts and long cuts

Tim BL, with his director hat off
$Id: Primer.html,v 1.59 2005/04/14 16:11:55 ijacobs Exp $