La quantità di Linked Data presenti  nel web sta aumentando negli ultimi anni. Lo dimostrano i dati forniti da DBpedia il punto di riferimento per la creazione e la sperimentazione di Linked Data. Come già abbiamo visto in articoli precedenti uno dei problemi più grandi per l’utilizzo live di questi dati è la necessità di avere uno SPARQL endpoint, cioè un POP (Point of Presence), un punto di accesso alla rete in grado di ricevere e processare richieste utilizzando il protocollo SPARQL.

Gli SPARQL endpoint richiedono molte risorse ai server e questo, obiettivamente, ne impedisce l’utilizzo su larga scala.

Una soluzione potrebbe essere quella di far ricadere il “peso” delle interrogazioni sul lato client, chiedendo agli utenti di scaricare tutto il database. Ma anche questa non è una soluzione perché semplicemente sposterebbe il problema senza risolverlo.

Linked Data Fragments

Cercare una via di mezzo tra questi due estremi ha portato, Ruben Verborgh ed i suoi collaboratori dell’Università di Ghent, alla teorizzazione e allo sviluppo dei Linked Data Fragments (LDF), dove il carico delle interrogazioni è suddiviso più equamente tra server e client. L’obiettivo dei Linked Data Fragments infatti è quello di rendere i client in grado di effettuare interrogazioni semantiche utilizzando il protocollo http. I Linked Data sono formati da triple, questo concetto lo ritroviamo nei LDF sotto forma di Triple Pattern Fragment. Ogni Linked Data Fragment è costituito da:
  • un pattern triplo come selettore
  • un oggetto che effettua il conteggio dei metadati
  • i controlli per recuperare qualsiasi altro frammento di pattern triplo dello stesso set di dati, in particolare altri frammenti a cui appartengono gli elementi corrispondenti.
Per far funzionare tutto questo ovviamente occorrono i server ed i client (in grado di risolvere query SPARQL). Nella documentazione ufficiale, che trovate [qui], è possibile scegliere tra sette diversi tipi di server: JavaScript, Python, Perl,Ruby, PHP, Java e NetKernel. Noi useremo la versione JavaScript che richiede Node.js. In questo articolo vedremo:
  1. come si installa un server LDF
  2. come si inseriscono i dati
  3. come si effettuano le interrogazioni

1. Linked Data Fragments Server

Avviamo la nostra macchina virtuale (Ubuntu Server 18.04.1 LTS) e installiamo Node.js, è richiesta la versione 4.0 (o superiori).

$ sudo apt install nodejs

e il server

$ [sudo] npm install -g ldf-server

A questo punto creiamo un file di configurazione in cui andremo a specificare quali sono le sorgenti dei nostri dati. Il server è molto flessibile e supporta vari formati:

  • HDT files
  • N-Triples documents
  • Turtle documents
  • JSON-LD documents
  • SPARQL endpoints

Noi useremo solo dati in formato JSON-LD. Osservando il file di configurazione si possono notare le impostazioni per settare la porta del server, il numero di workers e l’origine dei dati. Nello stesso file è possibile richiamare diversi dataset, in questo esempio sono tre: Places, People, e Events.

{
   "title": "Fontistoriche Linked Data Fragments Server",
   "baseURL": "/",
   "port": 5000,
   "workers": 1,
   "datasources": {
      "composite": {
         "title": "LDF - Fontistoriche",
         "type": "CompositeDatasource",
         "description": "Fontistoriche Linked Data Fragments",
         "settings": {
            "references": [
               "Places",
               "People",
               "Events"
            ]
         }
      },
      "Places": {
         "hide": true,
         "title": "Places",
         "type": "JsonLdDatasource",
         "description": "Luoghi",
         "settings": {
            "file": "/places.jsonld"
         }
      },
      "People": {
         "hide": true,
         "title": "People",
         "type": "JsonLdDatasource",
         "description": "Personaggi storici",
         "settings": {
            "file": "/people.jsonld"
         }
      },
      "Events": {
         "hide": true,
         "title": "Events",
         "type": "JsonLdDatasource",
         "description": "Eventi connessi ai personaggi storici",
         "settings": {
            "file": "/events.jsonld"
         }
      }
   },
   "logging": {
      "enabled": true,
      "file": "access.log",
      "format": null
   }
}


Adesso andiamo a vedere nello specifico come deve essere strutturato un file jsonld per renderlo intellegibile dal nostro server.

2. Inserimento dati, le specifiche dei file jsonld

{
   "@context": "http://schema.org/",
   "@id": "http://fontistoriche.org/person",
   "@type": "Person",
   "name": "People",
   "description": "Personaggi storici",
   "People": [
      {
         "@id": "https://fontistoriche.org/papa-paolo-i/",
         "@type": "Person",
         "name": "Papa Paolo I",
         "description": "Papa Paolo I è stato il 93º Papa della Chiesa cattolica, dal 29 maggio 757 alla sua morte.",
         "gender": "Male",
         "image": "https://fontistoriche.org/wp-content/uploads/papa-paolo-i.jpg",
         "sameAs": "https://it.wikipedia.org/wiki/Papa_Paolo_I",
         "birthDate": "0700",
         "birthPlace": "Roma",
         "deathDate": "0767-06-28",
         "deathPlace": "Roma"
      },
      {
         "@id": "https://fontistoriche.org/papa-stefano-iii/",
         "@type": "Person",
         "name": "Papa Stefano III",
         "description": "Papa Stefano III, o IV secondo una diversa numerazione, viene considerato il 94º papa della chiesa cattolica, dal 1º agosto 768 alla sua morte. ",
         "gender": "Male",
         "image": "https://fontistoriche.org/wp-content/uploads/papa-stefano-iii.jpg",
         "sameAs": "https://it.wikipedia.org/wiki/Papa_Stefano_III",
         "birthDate": "0720",
         "birthPlace": "Siracusa",
         "deathDate": "0772-01-24",
         "deathPlace": "Roma",
         "performerIn": "Concilio Lateranense (769)",
         "knows": "Pipino III (Pipino il Breve)"
      },
      {
         "@id": "https://fontistoriche.org/papa-adriano-i/",
         "@type": "Person",
         "name": "Papa Adriano I",
         "description": "Papa Adriano I è stato il 95º papa della Chiesa cattolica, dal 1º febbraio 772 al 795.",
         "gender": "Male",
         "image": "https://fontistoriche.org/wp-content/uploads/papa-adriano-i.jpg",
         "sameAs": "https://it.wikipedia.org/wiki/Papa_Adriano_I",
         "birthDate": "0700",
         "birthPlace": "Roma",
         "deathDate": "0795-12-25",
         "deathPlace": "Roma"
      }
   ]
}

Nell’esempio ho riportato un pezzo del dataset “People”. Come vocabolario ho preferito utilizzare schema ma volendo si possono usare anche gli altri.

Adesso possiamo far partire il nostro server specificando qual è il file di configurazione.

$ ldf-server config.json

Dal browser visitiamo il seguente link:

http://localhost:5000/

NOTA BENE: se si utilizza una macchina virtuale (come stiamo facendo noi), al posto di localhost occorre inserire l’indirizzo della macchina virtuale.

3. Avviare il server per effettuare le interrogazioni

Linked Data Fragments Server - triple

Il server risolve tutte le triple e ci indica anche il numero totale: 134. Ogni tripla è formata da un Soggetto, un Predicato ed un Oggetto.

Linked Data Fragments Server - Soggetto

Cliccando sul Soggetto Stefano III avremo infatti l’elenco di tutte le triple (12) in cui compare. Proseguiamo nell’esplorazione e clicchiamo su “Roma”.

Linked Data Fragments Server - Oggetto

“Roma” con il valore di Oggetto è presente in 6 triple. Adesso clicchiamo su “roma” come Soggetto e vedremo i dati geografici che sono presenti nel dataset Places.

Linked Data Fragments Server - Roma

Possiamo anche eseguire query specificando il Soggetto ed il Predicato

Linked Data Fragments Server - Soggetto Predicato

Anche se i dati che ho inserito sono parziali (non ho inserito tutti i figli di Pipino il Breve) il server mostra le 4 triple che mi aspettavo. Per fare questo tipo di ricerca però occorre inserire nei due campi: Soggetto e Predicato, gli URL completi.

Ho effettuato il deploy dell’applicazione su Heroku, il link, (non sempre attivo) è il seguente: https://fontistoriche.herokuapp.com/

Nei prossimi articoli vedremo altre sperimentazioni con i Linked Data Fragments.

Condividi questo articolo con tuoi amici
  • 12
    Shares

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *