Il formato proposto dal W3C per gli "open and linked data" è RDF.
Ogni dato del mondo reale viene detto risorsa e viene memorizzato ed esposto sotto forma di tripla: soggetto-predicato-oggetto
Il soggetto identifica la risorsa in modo univoco ed è generalmente un URI.
Il predicato è un URI che identifica una proprietà definita in un vocabolario (o ontologia).
L'oggetto può essere un valore "literal" (stringa, intero...) oppure nuovamente un URI che identifica un'altra risorsa.
In questo modo risorse presenti su dataset di origini diverse possono essere collegati tra di loro.
Questi collegamenti costituiscono quindi un grande grafo mondiale che contiene tutti i dati pubblicati secondo gli standard dei linked open data.
Le varie risorse costituiscono i nodi del grafo e le proprietà gli archi.
Una tripla rappresenta: un nodo del grafo (soggetto) collegato tramite un arco orientato (predicato) ad un'altra risorsa (oggetto).
Ogni organizzazione che pubblica dei dati secondo questo approccio, può definire sotto-grafi di appartenenza dei dati e offrire un endpoint grazie al quale effettuare query.
Il linguaggio utilizzato per effettuare le query è SPARQL.
I risultati delle query sono degli insiemi di triple, solitamente disponibili in vari formati (RDF, JSON, HTML...).
Vediamo di seguito uno dei possibili approcci per consultare un dataset RDF attraverso uno SPARQL Endpoint



                            SELECT DISTINCT ?graph
                            WHERE{
                            GRAPH ?graph {?s ?p ?o}
                            }


                        

1 - Ricerca Grafi

Come prima cosa chiediamo quali sono tutti i grafi disponibili.

La query restituisce l'insieme dei grafi in formato JSON.

La tabella che vedi dopo aver eseguito la query è ottenuta facendo un parsing del risultato JSON.

Seleziona un grafo dalla tabella per utilizzarlo nei prossimi step di ricerca.


2 - Ricerca Tipi

Prima di ricercare le risorse vere è proprie è utile sapere che tipi di risorse sono presenti nel grafo che abbiamo scelto (o in tutti i grafi della Regione Umbria se non abbiamo selezionato nessun grafo dalla tabella precedente).

Selezionando un tipo di dato, tra i risultati di questa query, fai in modo che la prossima query restituisca solo le risorse del tipo scelto.

Grafo



                            SELECT DISTINCT ?o
                            WHERE{
                            ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o
                            }


                        

Grafo



                                SELECT DISTINCT ?s ?p ?o
                                WHERE{
                                ?s ?p ?o .
                                ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <>
                                }
                                LIMIT 50


                            

3 - Ricerca Risorse

Possiamo finalmente effettuare una query delle risorse del tipo e nel grafo selezionati in precedenza.

Questa volta richiediamo tutte le triple che hanno come soggetto una risorsa del tipo scelto, il risultato sarà quindi un insieme di triple.

Soggetti, predicati e oggetti possono assumere valori literal, blank node o URI. Le risorse identificate da URI possiedono una rappresentazione HTML che puoi visualizzare con un semplice click.


Vediamo ora delle query più elaborate in modo tale da comprendere la sintassi SPARQL.

Come forse avrai intuito, le variabili sono precedute dal segno ?.

Nella clausola SELECT definiamo le variabili che devono essere mostrate in output, esse quindi devono essere necessariamente definite nella clausola WHERE.

Nella clausola WHERE filtriamo le triple del nostro grafo. Di base la sintassi ?s ?p ?o restituisce tutte le triple del grafo.
Il simbolo "." permette di concatenare le condizioni, quindi la sintassi ?s ?p ?o. ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?o restituisce tutte le triple del grafo che hanno come soggetto una risorsa che possiede il predicato http://www.w3.org/1999/02/22-rdf-syntax-ns#type




                            PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

                            SELECT ?resource_uri ?label
                            WHERE {
                            ?resource_uri geo:lat ?lat.
                            ?resource_uri geo:long ?long.
                            ?resource_uri rdfs:label ?label.
                            FILTER(xsd:double(?lat) <= xsd:double(43.137743) &&
                            xsd:double(?lat) >= xsd:double(43.064482) &&
                            xsd:double(?long) <= xsd:double(12.419962) &&
                            xsd:double(?long) >= xsd:double(12.329279)
                            )
                            }


                        

    

Attrattori di Perugia

Vediamo come estrarre i nomi di tutti gli attrattori appartenenti all'area Perugina

Le risorse sono filtrate in base alla longitudine e latitudine, prova a variare i valori per ottenere gli attrattori di tutta la regione Umbria.


Eventi di Terni

Vediamo come estrarre gli eventi organizzati a Terni

Le risorse sono filtrate in base al nome del comune di appartenenza.




                            PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
                            PREFIX dc: <http://purl.org/dc/elements/1.1/>
                            PREFIX schema: <http://schema.org/>

                            SELECT ?resource_uri ?nome_evento
                            WHERE{
                            ?resource_uri rdfs:label ?nome_evento.
                            ?resource_uri rdf:type schema:Event.
                            ?resource_uri dbpedia-owl:municipality ?municipality.
                            FILTER regex(?municipality, "Terni", "i")
                            }