L’oltretesto

Lezione 09 del corso di Digital Humanities e Data Management per i Beni Culturali (2024/2025)

Sebastian Barzaghi | sebastian.barzaghi2@unibo.it | https://orcid.org/0000-0002-0799-1527 | https://www.unibo.it/sitoweb/sebastian.barzaghi2/

RDF

Resource Description Framework

Fonte: Bernard, C. (2019). Immersing evolving geographic divisions in the semantic Web (Doctoral dissertation, Université Grenoble Alpes). https://theses.hal.science/tel-02524361v1.

Modello di dati standard che permette di rappresentare, descrivere, e pubblicare i dati sul Web in un formato accessibile e interpretabile dalle macchine tramite l'utilizzo di triple soggetto-predicato-oggetto.

L’unità minima nei LOD: la tripla RDF

Fonte: Jonathan Blaney, "Introduction to the Principles of Linked Open Data," Programming Historian 6 (2017), https://doi.org/10.46430/phen0068.

Un'asserzione informativa riguardante una risorsa che si articola in:

  • Soggetto: una risorsa trattata nell'asserzione;
  • Predicato: una caratteristica del soggetto;
  • Oggetto: una risorsa o un valore espresso dal predicato.

Riprendiamo il nostro esempio con Neuromante

Neuromante, scritto da William Gibson (una persona) e pubblicato nel 1984, è un libro di 271 pagine e di genere cyberpunk (un genere).

Individuiamo classi, entità, attributi e relazioni.

Riprendiamo il nostro esempio con Neuromante

  • Neuromante è un libro;
  • William Gibson è una persona;
  • cyberpunk è un genere;
  • Neuromante scritto da William Gibson;
  • Neuromante pubblicato nel “1984”;
  • Neuromante ha pagine “271”;
  • Neuromante ha genere cyberpunk.

I dati in RDF formano un grafo

Le triple RDF sono rappresentabili in nodi e archi di un grafo:

  • un nodo per il soggetto;
  • un arco per il predicato, diretto dal soggetto all’oggetto;
  • un nodo per l’oggetto.

I dati in RDF formano un grafo

Fonte: propria.
  • Neuromante è un libro;
  • William Gibson è una persona
  • cyberpunk è un genere;
  • Neuromante scritto da William Gibson;
  • Neuromante pubblicato nel "1984";
  • Neuromante ha pagine "271";
  • Neuromante ha genere cyberpunk.

Astrazione: dai dati particolari al modello generale

Fonte: propria.
  • Libro scritto da Persona;
  • Libro ha genere Genere;
  • Libro pubblicato nel "data";
  • Libro ha pagine "numero";

Non dimentichiamoci gli URI!

Ricordiamoci che in RDF le risorse e le proprietà devono essere identificate univocamente tramite URI.

Inventiamoci un URI come base per il nostro modello (http://example.org/dhdmch) e identifichiamo classi e proprietà:

Grafo del modello con URI

Fonte: propria.
  • Libro diventa http://example.org/dhdmch/Book;
  • Persona diventa http://example.org/dhdmch/Person;
  • Genere diventa http://example.org/dhdmch/Genre;
  • scritto da diventa http://example.org/dhdmch/hasCreator;
  • ha genere diventa http://example.org/dhdmch/hasGenre;
  • pubblicato nel diventa http://example.org/dhdmch/hasPublicationDate;
  • ha pagine diventa http://example.org/dhdmch/hasNumberOfPages.

Anche i dati hanno bisogno di URI

I dati (le istanze, ovvero le entità, come Neuromante e William Gibson), se vogliamo che siano LOD e se scegliamo RDF come strumento di modellazione, devono avere i propri URI.

Inventiamoci un URI per i nostri dati: http://example.org/data.

Non useremo questo URI per cyberpunk, che invece manterrà l’URI del modello.

Grafo dei dati con URI

Fonte: propria.
  • Neuromante diventa http://example.org/data/neuromancer;
  • William Gibson diventa http://example.org/data/william-gibson;
  • cyberpunk diventa http://example.org/dhdmch/cyberpunk.

Una precisazione: i literal

Ciò che può essere l’oggetto di una tripla RDF e che abbiamo chiamato “valore” (testuale, numerico, temporale, ecc.).

In altre parole, i valori degli attributi.

Due tipi:

  • Non tipizzati: il loro datatype non è specificato (es. "271"), e al massimo possono avere un tag linguistico reso combinando la stringa con @ e il valore di una lingua espressa seguendo lo standard ISO 639-1 (es. "Stringa in italiano"@it);
  • Tipizzati: il loro datatype è specificato combinando la stringa con due ^ e l’URI che identifica quel datatype (es. "271"^^http://www.w3.org/2001/XMLSchema#integer).

Una precisazione: come scrivere classi, proprietà ed entità nell’URI

RDF non dà regole vere e proprie su come scrivere, ma esistono convenzioni.

Esempio:

  • Le classi iniziano sempre con la lettera maiuscola (es. Book);
  • Le proprietà (relazioni e attributi) iniziano sempre con la lettera minuscola (es. date);
  • Se classi o proprietà sono composti da più parole, in genere sono espresse in CamelCase (es. DigitizationProcess, hasCreator);
  • Le entità iniziano sempre con la lettera minuscola e, se sono composte da più parole, in genere sono tenute assieme dai trattini (es. optical-scanner).

Una precisazione: i namespace

Cosa notate?

http://example.org/dhdmch

http://example.org/dhdmch/Book

Uno è l’URI “del modello”, l’altro è di una classe appartenente a quel modello

http://example.org/dhdmch (URI “del modello”)

http://example.org/dhdmch/Book (URI della classe Book del modello)

La parte di URI in comune fa da “base” per gli URI degli elementi (classi, proprietà, entità): fa cioè da namespace

http://example.org/dhdmch (URI del modello)

http://example.org/dhdmch/Book (URI della classe Book del modello)

L’ultima parte dell’URI dell’elemento si riferisce all’elemento

Inizia con un separatore (di solito un / o un #).

http://example.org/dhdmch/Book (URI della classe Book del modello)

Il discorso vale anche per i dati

http://example.org/data http://example.org/data/neuromante

Un piccolo limite di RDF in quanto modello di dati

Dice cosa fare, ma non dice:

  • Come scrivere triple: per questo ci sono le serializzazioni (es. RDF/XML, Turtle, ecc.) che specificano la sintassi da usare;
  • Come esprimere entità e proprietà: per questo esistono i modelli semantici (es. vocabolari controllati, ontologie, ecc.) che specificano il lessico da usare.

Turtle

Turtle è una maniera accessibile e leggibile per scrivere triple in RDF

Una tripla in Turtle è scritta sequenziando soggetto, predicato e oggetto uno dopo l’altro e separati da uno spazio.

Una tripla finisce sempre con un punto.

[SOGGETTO] [PREDICATO] [OGGETTO] .

Anche altre serializzazioni fanno cose simili…

Esempio: Neuromante è un libro diventa

<http://example.org/data/neuromancer> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/dhdmch/Book>

Ma Turtle è più leggibile, grazie ai prefissi

Turtle permette di usare prefissi per accorciare gli URI degli elementi (sostituendo la base offerta dai rispettivi modelli) e rendere le triple più leggibili.

@prefix prefisso: <uri/del/modello/con/separatore/> .

@prefix dhdmch: <http://example.org/dhdmch/> .  
@prefix ex: <http://example.org/data/> .  
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  

...

Turtle: prefissi

I prefissi ci permettono di evitare di dover ripetere l’URI completo ogni volta.

@prefix dhdmch: <http://example.org/dhdmch/> .  
@prefix ex: <http://example.org/data/> .  
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>

ex:neuromante rdf:type dhdmch:Book .

Turtle: triple

Per il resto, non è altro che una sequenza di triple.

Se ci dovessero essere URI completi, vanno racchiusi tra caporali.

@prefix dhdmch: <http://example.org/dhdmch/> .  
@prefix ex: <http://example.org/data/> .  
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:neuromante rdf:type dhdmch:Book .  
ex:neuromante dhdmch:publicationDate "1984"^^xsd:gYear .  
ex:neuromante dhdmch:genre dhdmch:cyberpunk .  
ex:neuromante dhdmch:creator ex:william-gibson .  
ex:neuromante dhdmch:pages "271"^^xsd:integer .  
ex:william-gibson rdf:type dhdmch:Person .

Turtle: triple

Se abbiamo più triple con lo stesso soggetto, possiamo utilizzare una sintassi più elegante, con una prima tripla che esprime il soggetto e tutte le altre indentate sotto la prima che sottointendono il soggetto.

Ogni tripla che non è l’ultima finisce con il punto e virgola.

@prefix dhdmch: <http://example.org/dhdmch/> .  
@prefix ex: <http://example.org/data/> .  
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:neuromante rdf:type dhdmch:Book ;  
  dhdmch:publicationDate "1984"^^xsd:gYear ;  
  dhdmch:genre dhdmch:cyberpunk ;  
  dhdmch:creator ex:william-gibson ;  
  dhdmch:pages "271"^^xsd:integer . 

ex:william-gibson rdf:type dhdmch:Person .

Tutto bello… ma l’interoperabilità?

Un ultimo passaggio

In un certo senso, abbiamo già riutilizzato dei modelli esistenti (es. per xsd:gYear o rdf:type).

Il nostro dhdmch è in sostanza la reinvenzione della ruota: esistono già molteplici modelli in grado di descrivere libri (e il dominio bibliografico in senso lato).

Anche la classe Persona e il valore controllato di cyberpunk, probabilmente, esistono già.

Riusiamo modelli esistenti, quando possibile

A patto di rispettare le costrizioni logiche dei modelli esistenti che intendiamo riutilizzare, li possiamo combinare per fare una descrizione interoperabile dei dati diminuendo drasticamente lo sforzo di creazione e favorendo l’interoperabilità dei dati.

Alcuni modelli:

Le triple, riscritte con modelli esistenti

Le triple, riscritte con modelli esistenti

@prefix ex: <http://example.org/data/> .
@prefix fabio: <http://purl.org/spar/fabio/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix prism: <http://prismstandard.org/namespaces/basic/2.0/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix lcsh: <http://id.loc.gov/authorities/subjects/> .

ex:neuromancer rdf:type fabio:Book ;  
  prism:publicationDate "1984" ;  
  dct:genre lcsh:sh2012000080 ;  
  dct:creator ex:william-gibson ;  
  fabio:hasPageCount "271" .

ex:william-gibson a foaf:Person .

Il grafo, riscritto con modelli esistenti

Fonte: propria.

Attività pratica

Il dataset Mythologiae è strutturato in 31 colonne

Alcune di questi metadati (es. dcho_id, dcho_title, dcho_publication_date) si riferiscono all’ oggetto digitale (ovvero la rappresentazione dell’oggetto fisico, creata sul sito).

Altri (es. cho_title, cho_author, cho_description) si riferiscono all’oggetto fisico, l’opera reale che viene descritta.

Modelliamo questi metadati usando RDF

Modelliamo questi metadati usando RDF

Fine

Lezione 09 del corso di Digital Humanities e Data Management per i Beni Culturali (2024/2025)

Sebastian Barzaghi | sebastian.barzaghi2@unibo.it | https://orcid.org/0000-0002-0799-1527 | https://www.unibo.it/sitoweb/sebastian.barzaghi2/