LOD, SPARQL e
dintorni:
Un piccolo how-to
Nicola Vitucci
Intro
● LOD, ovvero Linked Open Data
– Linked Data + Open Data = Dati “a
5 stelle”
● Il WWW è un immenso database
(Web of Data)
● Cosa vuol dire? A che serve? A chi
serve?
Dati a 5 stelle
da http://5stardata.info
Dati a 5 stelle: come
★ Disponibili sul Web in qualsiasi formato purché con licenza
aperta (per diventare Open Data)
★★ Disponibili come dati strutturati “machine readable” (per esempio
in formato Excel invece della scansione di una tabella)
★★★ Come (2) più formato non proprietario (per esempio CSV
invece di Excel)
★★★★ Tutti i precedenti più uso di standard aperti sviluppati dal W3C
(RDF e SPARQL) per identificare le risorse, così è possibile
trovare il proprio materiale in rete
★★★★★ Tutti i precedenti più collegamento dei propri dati a dati altrui per
dare contesto
Dati a 5 stelle: per chi
★ Chiunque può leggere, stampare, condividere i dati
★★ (1) + chiunque può processare automaticamente i dati usando
software proprietario
★★★ (2) + chiunque più processare automaticamente i dati senza il
vincolo di possedere alcun tipo di software proprietario
★★★★ (3) + chiunque può creare link e bookmark verso i dati e
aggiungervi altri dati
★★★★★ (4) + chiunque può scoprire altre informazioni rilevanti e capire lo
schema dei dati
Principi
● Usare URI come ID unico per una
risorsa; diverso da URL
● Usare HTTP (invece di altri schemi
come URN, ISBN ecc.)
● Fornire informazioni utili quando si
dereferenzia un ID
● Fornire link ad altre risorse
LOD cloud
da http://lod-cloud.net/versions/2014-08-30/lod-cloud_colored.png
LOD cloud
da http://lod-cloud.net/versions/2014-08-30/lod-cloud_colored.png
RDF: principi
● RDF (Resource Description
Framework) è uno dei mattoncini per
costruire i LOD
● È un modello, non un formato
– RDF non vuol dire necessariamente
XML!
– Diverse serializzazioni
RDF: serializzazioni
● Diversi formati:
– XML
– Turtle
– RDFa
● Scarichiamo un file RDF da Internet
– http://www.ivan-herman.net/foaf.rdf
– http://www.ivan-herman.net/foaf.ttl
RDF: serializzazioni
Formato XML:
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:ns11="http://www.w3.org/2003/01/geo/wgs84_pos#"
...
>
<ns1:Person rdf:about="http://www.ivan-herman.net/foaf#me">
<ns1:worksFor>
<rdf:Description rdf:about="http://www.cwi.nl">
<ns7:title>Centre Mathematics and Computer Sciences (CWI)</ns7:title>
</rdf:Description>
...
RDF: serializzazioni
Formato Turtle:
@prefix ns1: <http://xmlns.com/foaf/0.1/> .
@prefix ns10: <http://www.w3.org/ns/auth/cert#> .
@prefix ns2: <http://xmlns.com/wot/0.1/> .
...
<http://www.ivan-herman.net/foaf> a ns1:PersonalProfileDocument ;
ns5:creator "Ivan Herman" ;
ns5:date "2015-03-02"^^xsd:date ;
ns5:title "Ivan Herman’s homepage" ;
rdfs:seeAlso <http://www.ivan-herman.net/foafExtras.rdf> ;
ns1:primaryTopic <http://www.ivan-herman.net/foaf#me> ;
...
RDF: serializzazioni
Formato RDFa: visualizzare il codice sorgente di http://www.ivan-herman.net/
<body id="me" prefix=" air: http://www.daml.org/2001/10/html/airport-ont#
...
>
<div id="container" about="http://www.ivan-herman.net/foaf#me" typeof="schema:Person
foaf:Person dc:Agent">
<div id="linkList" >
<img property="foaf:img schema:image" class="flr" src="http://www.ivan-
herman.net/Images/me2014-small.jpg" alt="Photo of Ivan Herman"/>
<div id="linkList2">
<ul>
<li><a property="foaf:homepage schema:url" href="http://www.ivan-herman.net">personal
homepage</a></li>
...
RDF: serializzazioni
● Si può usare la content negotiation per ottenere
serializzazioni diverse per lo stesso file
– Da Linux si può usare curl
– In alternativa, ci sono client REST per Firefox
e Chrome
● $ curl ­H "Accept: application/rdf+xml" 
http://www.ivan­herman.net/foaf
● $ curl ­H "Accept: text/turtle” 
http://www.ivan­herman.net/foaf
RDF: principi
● RDF si basa sul concetto di tripla, cioè:
– di soggetto legato a un oggetto tramite un
predicato
– di attributo che lega un'entità identificata da un
URI a un valore (o a un'altra entità)
● Diversamente dai database tradizionali, è la
relazione tra due elementi che conta
RDF: principi
Database relazionale:
RDF:
Qual è l'unità di misura del peso? Cosa vuol dire “prodotto”?
Peso Prodotto
Ingrediente 1 10 Prodotto 1
Ingrediente 2 20 Prodotto 1
Ingrediente 1
Ingrediente 2
Prodotto 1
prodotto
prodotto
10
20
peso
peso
RDF: schema dati
● In un database relazionale dobbiamo
cercare altrove la definizione precisa dello
schema dei dati
● Usando RDF possiamo descrivere nel
dettaglio sia i dati che lo schema!
● Per farlo ci serviremo di vocabolari
– I termini di un vocabolario hanno un URI
di base comune chiamato namespace
Vocabolari comuni
● rdf, rdfs, owl – il “core” di RDF
● dcterms – proprietà generiche delle risorse
● FOAF – Friend of a Friend (ci torniamo più tardi)
● geo – geolocalizzazione
● skos – descrizione di schemi e tassonomie
● void, dcat – descrizione di dataset
● doap – descrizione di progetti
Vocabolari comuni
● rdf e rdfs sono particolarmente utili
perché servono a definire lo schema dei
dati
● Usando rdf si può descrivere
l'appartenenza di un'entità a una classe
● Usando rdfs si possono definire
relazioni di super- e sottoclasse
Esempi
● “Il gatto è un animale”
– ns1:gatto rdf:type 
ns2:Mammifero
– ns1:gatto a ns2:Mammifero
● “I mammiferi sono animali”
– ns2:Mammifero 
rdfs:subClassOf ns2:Animale
Ontologie
● Un'ontologia è un modello usato per
descrivere un certo dominio
● Si possono esprimere concetti
articolati ed interessanti
● È più difficile da sviluppare perché
bisogna fare diverse considerazioni
logiche e di modellazione
Trovare i LOD
● Dobbiamo conoscere i dettagli di RDF per
usare i LOD?
● Approccio “follow your nose” grazie ai link
– http://dati.isprambiente.it/id/website/html
– https://www.wikidata.org
– http://sameas.org
– https://datahub.io
Usare LOD
● Noi vogliamo “sporcarci le mani”
● SPARQL!
SPARQL
● SPARQL è per RDF ciò che SQL è
per i database: un linguaggio di
interrogazione
● Essendo RDF un formato “a grafo”,
anche le query RDF sono
essenzialmente “a grafo”
SPARQL
● Oltre che un linguaggio di
interrogazione, SPARQL è anche un
protocollo di comunicazione
● Un endpoint SPARQL è una risorsa
alla quale possiamo mandare delle
query SPARQL e che ci darà dei dati
come risultato (se ce ne sono di
corrispondenti alla nostra query)
SPARQL
● Esempi di endpoint SPARQL:
– http://it.dbpedia.org/sparql
– https://query.wikidata.org/
– http://dati.isprambiente.it/sparql
– http://dati.camera.it/sparql
Query SPARQL
Esempio di query SPARQL su dbpedia: “Compositori delle colonne sonore di tutti i film di produzione
italiana in bianco/nero”
PREFIX dbpedia­owl: <http://dbpedia.org/ontology/>
SELECT * 
WHERE {
 ?film a dbpedia­owl:Film .
 ?film dbpedia­owl:country <http://it.dbpedia.org/resource/Italia> .
 ?film dbpedia­owl:filmColourType ?colore .
 ?film dbpedia­owl:musicComposer ?compositore .
 FILTER ( ?colore in ("B/N"@it, "bianco/nero"@it ) )
}
Query SPARQL
Pagina dei risultati:
film colore compositore
http://it.dbpedia.org/resource/
Roma_città_aperta
"B/N"^^<http://www.w3.org/
2001/XMLSchema#string>
http://it.dbpedia.org/resource/
Renzo_Rossellini
http://it.dbpedia.org/resource/
Roma_città_aperta
"B/N"^^<http://www.w3.org/
2001/XMLSchema#string>
http://it.dbpedia.org/resource/
Felice_Lattuada
http://it.dbpedia.org/resource/
Roma_città_aperta
"B/N"^^<http://www.w3.org/
2001/XMLSchema#string>
http://it.dbpedia.org/resource/
Nino_Rota
http://it.dbpedia.org/resource/
La_dolce_vita
"B/N"^^<http://www.w3.org/
2001/XMLSchema#string>
http://it.dbpedia.org/resource/
Nino_Rota
Query SPARQL
Risultati in XML:
<sparql xmlns="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd">
<head>
<variable name="film"/>
<variable name="colore"/>
<variable name="compositore"/>
</head>
<results distinct="false" ordered="true">
<result>
<binding name="film"><uri>http://it.dbpedia.org/resource/Roma_città_aperta</uri></binding>
<binding name="colore"><literal datatype="http://www.w3.org/2001/XMLSchema#string">B/N</literal></binding>
<binding name="compositore"><uri>http://it.dbpedia.org/resource/Renzo_Rossellini</uri></binding>
</result>
...
Query SPARQL
Risultati in JSON:
{ "head": { "link": [], "vars": ["film", "colore", "compositore"] },
"results": { "distinct": false, "ordered": true, "bindings": [
{ "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/Roma_cittu00E0_aperta" } ,
"colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } ,
"compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Renzo_Rossellini" }},
{ "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/Luci_del_varietu00E0" } ,
"colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } ,
"compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Felice_Lattuada" }},
{ "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/La_strada" },
"colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } ,
"compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Nino_Rota" }},
...
Query SPARQL
● Come faccio a sapere quali classi
utilizzare nella query?
● Due modi:
– Cerco l'ontologia di dbpedia:
http://dbpedia.org/ontology/
– Trovo tutte le classi direttamente
sull'endpoint SPARQL
Query SPARQL
Per trovare le classi usate nell'endpoint:
●
Cerco prima i grafi (~ dataset) disponibili e trovo <http://it.dbpedia.org>
SELECT DISTINCT ?g 
WHERE {
  GRAPH ?g {?s a ?cl}
}
●
Cerco tutte le classi definite nel grafo più “interessante”
SELECT DISTINCT ?cl 
WHERE {
  GRAPH <http://it.dbpedia.org> {?s a ?cl}
}
Query SPARQL
● Supponiamo di aver trovato http://dbpedia.org/ontology/Person
● Vogliamo sapere se esistono classi più specializzate:
PREFIX dbpedia: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?cl
WHERE {
  ?cl rdfs:subClassOf dbpedia:Person
}
● Troviamo per esempio dbpedia:Artist, dbpedia:Athlete, ...
Considerazioni
● Facciamo il punto
Grazie!

LOD, SPARQL e dintorni

  • 1.
    LOD, SPARQL e dintorni: Unpiccolo how-to Nicola Vitucci
  • 2.
    Intro ● LOD, ovveroLinked Open Data – Linked Data + Open Data = Dati “a 5 stelle” ● Il WWW è un immenso database (Web of Data) ● Cosa vuol dire? A che serve? A chi serve?
  • 3.
    Dati a 5stelle da http://5stardata.info
  • 4.
    Dati a 5stelle: come ★ Disponibili sul Web in qualsiasi formato purché con licenza aperta (per diventare Open Data) ★★ Disponibili come dati strutturati “machine readable” (per esempio in formato Excel invece della scansione di una tabella) ★★★ Come (2) più formato non proprietario (per esempio CSV invece di Excel) ★★★★ Tutti i precedenti più uso di standard aperti sviluppati dal W3C (RDF e SPARQL) per identificare le risorse, così è possibile trovare il proprio materiale in rete ★★★★★ Tutti i precedenti più collegamento dei propri dati a dati altrui per dare contesto
  • 5.
    Dati a 5stelle: per chi ★ Chiunque può leggere, stampare, condividere i dati ★★ (1) + chiunque può processare automaticamente i dati usando software proprietario ★★★ (2) + chiunque più processare automaticamente i dati senza il vincolo di possedere alcun tipo di software proprietario ★★★★ (3) + chiunque può creare link e bookmark verso i dati e aggiungervi altri dati ★★★★★ (4) + chiunque può scoprire altre informazioni rilevanti e capire lo schema dei dati
  • 6.
    Principi ● Usare URIcome ID unico per una risorsa; diverso da URL ● Usare HTTP (invece di altri schemi come URN, ISBN ecc.) ● Fornire informazioni utili quando si dereferenzia un ID ● Fornire link ad altre risorse
  • 7.
  • 8.
  • 9.
    RDF: principi ● RDF(Resource Description Framework) è uno dei mattoncini per costruire i LOD ● È un modello, non un formato – RDF non vuol dire necessariamente XML! – Diverse serializzazioni
  • 10.
    RDF: serializzazioni ● Diversiformati: – XML – Turtle – RDFa ● Scarichiamo un file RDF da Internet – http://www.ivan-herman.net/foaf.rdf – http://www.ivan-herman.net/foaf.ttl
  • 11.
    RDF: serializzazioni Formato XML: <?xmlversion="1.0" encoding="utf-8"?> <rdf:RDF xmlns:ns11="http://www.w3.org/2003/01/geo/wgs84_pos#" ... > <ns1:Person rdf:about="http://www.ivan-herman.net/foaf#me"> <ns1:worksFor> <rdf:Description rdf:about="http://www.cwi.nl"> <ns7:title>Centre Mathematics and Computer Sciences (CWI)</ns7:title> </rdf:Description> ...
  • 12.
    RDF: serializzazioni Formato Turtle: @prefixns1: <http://xmlns.com/foaf/0.1/> . @prefix ns10: <http://www.w3.org/ns/auth/cert#> . @prefix ns2: <http://xmlns.com/wot/0.1/> . ... <http://www.ivan-herman.net/foaf> a ns1:PersonalProfileDocument ; ns5:creator "Ivan Herman" ; ns5:date "2015-03-02"^^xsd:date ; ns5:title "Ivan Herman’s homepage" ; rdfs:seeAlso <http://www.ivan-herman.net/foafExtras.rdf> ; ns1:primaryTopic <http://www.ivan-herman.net/foaf#me> ; ...
  • 13.
    RDF: serializzazioni Formato RDFa:visualizzare il codice sorgente di http://www.ivan-herman.net/ <body id="me" prefix=" air: http://www.daml.org/2001/10/html/airport-ont# ... > <div id="container" about="http://www.ivan-herman.net/foaf#me" typeof="schema:Person foaf:Person dc:Agent"> <div id="linkList" > <img property="foaf:img schema:image" class="flr" src="http://www.ivan- herman.net/Images/me2014-small.jpg" alt="Photo of Ivan Herman"/> <div id="linkList2"> <ul> <li><a property="foaf:homepage schema:url" href="http://www.ivan-herman.net">personal homepage</a></li> ...
  • 14.
    RDF: serializzazioni ● Sipuò usare la content negotiation per ottenere serializzazioni diverse per lo stesso file – Da Linux si può usare curl – In alternativa, ci sono client REST per Firefox e Chrome ● $ curl ­H "Accept: application/rdf+xml"  http://www.ivan­herman.net/foaf ● $ curl ­H "Accept: text/turtle”  http://www.ivan­herman.net/foaf
  • 15.
    RDF: principi ● RDFsi basa sul concetto di tripla, cioè: – di soggetto legato a un oggetto tramite un predicato – di attributo che lega un'entità identificata da un URI a un valore (o a un'altra entità) ● Diversamente dai database tradizionali, è la relazione tra due elementi che conta
  • 16.
    RDF: principi Database relazionale: RDF: Qualè l'unità di misura del peso? Cosa vuol dire “prodotto”? Peso Prodotto Ingrediente 1 10 Prodotto 1 Ingrediente 2 20 Prodotto 1 Ingrediente 1 Ingrediente 2 Prodotto 1 prodotto prodotto 10 20 peso peso
  • 17.
    RDF: schema dati ●In un database relazionale dobbiamo cercare altrove la definizione precisa dello schema dei dati ● Usando RDF possiamo descrivere nel dettaglio sia i dati che lo schema! ● Per farlo ci serviremo di vocabolari – I termini di un vocabolario hanno un URI di base comune chiamato namespace
  • 18.
    Vocabolari comuni ● rdf,rdfs, owl – il “core” di RDF ● dcterms – proprietà generiche delle risorse ● FOAF – Friend of a Friend (ci torniamo più tardi) ● geo – geolocalizzazione ● skos – descrizione di schemi e tassonomie ● void, dcat – descrizione di dataset ● doap – descrizione di progetti
  • 19.
    Vocabolari comuni ● rdfe rdfs sono particolarmente utili perché servono a definire lo schema dei dati ● Usando rdf si può descrivere l'appartenenza di un'entità a una classe ● Usando rdfs si possono definire relazioni di super- e sottoclasse
  • 20.
    Esempi ● “Il gattoè un animale” – ns1:gatto rdf:type  ns2:Mammifero – ns1:gatto a ns2:Mammifero ● “I mammiferi sono animali” – ns2:Mammifero  rdfs:subClassOf ns2:Animale
  • 21.
    Ontologie ● Un'ontologia èun modello usato per descrivere un certo dominio ● Si possono esprimere concetti articolati ed interessanti ● È più difficile da sviluppare perché bisogna fare diverse considerazioni logiche e di modellazione
  • 22.
    Trovare i LOD ●Dobbiamo conoscere i dettagli di RDF per usare i LOD? ● Approccio “follow your nose” grazie ai link – http://dati.isprambiente.it/id/website/html – https://www.wikidata.org – http://sameas.org – https://datahub.io
  • 23.
    Usare LOD ● Noivogliamo “sporcarci le mani” ● SPARQL!
  • 24.
    SPARQL ● SPARQL èper RDF ciò che SQL è per i database: un linguaggio di interrogazione ● Essendo RDF un formato “a grafo”, anche le query RDF sono essenzialmente “a grafo”
  • 25.
    SPARQL ● Oltre cheun linguaggio di interrogazione, SPARQL è anche un protocollo di comunicazione ● Un endpoint SPARQL è una risorsa alla quale possiamo mandare delle query SPARQL e che ci darà dei dati come risultato (se ce ne sono di corrispondenti alla nostra query)
  • 26.
    SPARQL ● Esempi diendpoint SPARQL: – http://it.dbpedia.org/sparql – https://query.wikidata.org/ – http://dati.isprambiente.it/sparql – http://dati.camera.it/sparql
  • 27.
    Query SPARQL Esempio diquery SPARQL su dbpedia: “Compositori delle colonne sonore di tutti i film di produzione italiana in bianco/nero” PREFIX dbpedia­owl: <http://dbpedia.org/ontology/> SELECT *  WHERE {  ?film a dbpedia­owl:Film .  ?film dbpedia­owl:country <http://it.dbpedia.org/resource/Italia> .  ?film dbpedia­owl:filmColourType ?colore .  ?film dbpedia­owl:musicComposer ?compositore .  FILTER ( ?colore in ("B/N"@it, "bianco/nero"@it ) ) }
  • 28.
    Query SPARQL Pagina deirisultati: film colore compositore http://it.dbpedia.org/resource/ Roma_città_aperta "B/N"^^<http://www.w3.org/ 2001/XMLSchema#string> http://it.dbpedia.org/resource/ Renzo_Rossellini http://it.dbpedia.org/resource/ Roma_città_aperta "B/N"^^<http://www.w3.org/ 2001/XMLSchema#string> http://it.dbpedia.org/resource/ Felice_Lattuada http://it.dbpedia.org/resource/ Roma_città_aperta "B/N"^^<http://www.w3.org/ 2001/XMLSchema#string> http://it.dbpedia.org/resource/ Nino_Rota http://it.dbpedia.org/resource/ La_dolce_vita "B/N"^^<http://www.w3.org/ 2001/XMLSchema#string> http://it.dbpedia.org/resource/ Nino_Rota
  • 29.
    Query SPARQL Risultati inXML: <sparql xmlns="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd"> <head> <variable name="film"/> <variable name="colore"/> <variable name="compositore"/> </head> <results distinct="false" ordered="true"> <result> <binding name="film"><uri>http://it.dbpedia.org/resource/Roma_città_aperta</uri></binding> <binding name="colore"><literal datatype="http://www.w3.org/2001/XMLSchema#string">B/N</literal></binding> <binding name="compositore"><uri>http://it.dbpedia.org/resource/Renzo_Rossellini</uri></binding> </result> ...
  • 30.
    Query SPARQL Risultati inJSON: { "head": { "link": [], "vars": ["film", "colore", "compositore"] }, "results": { "distinct": false, "ordered": true, "bindings": [ { "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/Roma_cittu00E0_aperta" } , "colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } , "compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Renzo_Rossellini" }}, { "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/Luci_del_varietu00E0" } , "colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } , "compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Felice_Lattuada" }}, { "film": { "type": "uri", "value": "http://it.dbpedia.org/resource/La_strada" }, "colore": { "type": "typed-literal", "datatype": "http://www.w3.org/2001/XMLSchema#string", "value": "B/N" } , "compositore": { "type": "uri", "value": "http://it.dbpedia.org/resource/Nino_Rota" }}, ...
  • 31.
    Query SPARQL ● Comefaccio a sapere quali classi utilizzare nella query? ● Due modi: – Cerco l'ontologia di dbpedia: http://dbpedia.org/ontology/ – Trovo tutte le classi direttamente sull'endpoint SPARQL
  • 32.
    Query SPARQL Per trovarele classi usate nell'endpoint: ● Cerco prima i grafi (~ dataset) disponibili e trovo <http://it.dbpedia.org> SELECT DISTINCT ?g  WHERE {   GRAPH ?g {?s a ?cl} } ● Cerco tutte le classi definite nel grafo più “interessante” SELECT DISTINCT ?cl  WHERE {   GRAPH <http://it.dbpedia.org> {?s a ?cl} }
  • 33.
    Query SPARQL ● Supponiamodi aver trovato http://dbpedia.org/ontology/Person ● Vogliamo sapere se esistono classi più specializzate: PREFIX dbpedia: <http://dbpedia.org/ontology/> SELECT DISTINCT ?cl WHERE {   ?cl rdfs:subClassOf dbpedia:Person } ● Troviamo per esempio dbpedia:Artist, dbpedia:Athlete, ...
  • 34.
  • 35.