Query SPARQL su DBpedia con Jena

87 views
Skip to first unread message

a.ge...@studenti.uniba.it

unread,
Aug 18, 2017, 5:59:54 AM8/18/17
to Spaghetti Open Data
salve, sono alle prime armi con Java e con SPARQL, sto realizzando un piccolo software e ho bisogno di una mano. Ho realizzato l'interfaccia con Javafx e ora manca il "cuore" del software, lo scopo del programma è quello di poter effettuare una "Metaquery" su di un grafo di conoscenza ad esempio DBpedia, attraverso un pattern espresso (di cui parlerò in basso). 
Ho pensato quindi che sia necessario integrare la libreria di Jena, e successivamente dovrei eseguire un query sparql su dbpedia a seconda di un "pattern" creato da me ad esempio :
Se scrivo P(?x,?y) voglio eseguire una query sparql su dbpedia che cerca tutti gli individui (soggetto e oggetto) che hanno una certa proprietà P.

Sparql :
"Select ?x , P , ?y 
  where ?x P ?y "

come dovrei comportarmi con i prefissi? qualcuno è in grado di correggermela e darmi una mano?

Nel caso il pattern fosse costituito da piu parti come questo : P(x,y) Q(x,z)
quindi la query mi cerchera su dbpedia tutte le tuple in cui l'individuo x condivide due qualsiasi proprietà con altri due individui y e z.

NB: per ora il mio scopo è capire le query da fare per 

Ringrazio chiunque riesca a darmi una mano perché sono diversi giorni che non riesco a venirne a capo.

Cristiano Longo

unread,
Aug 18, 2017, 6:04:38 AM8/18/17
to spaghett...@googlegroups.com



On 18/08/2017 11:59, a.ge...@studenti.uniba.it wrote:
salve, sono alle prime armi con Java e con SPARQL, sto realizzando un piccolo software e ho bisogno di una mano. Ho realizzato l'interfaccia con Javafx e ora manca il "cuore" del software, lo scopo del programma è quello di poter effettuare una "Metaquery" su di un grafo di conoscenza ad esempio DBpedia, attraverso un pattern espresso (di cui parlerò in basso). 
Ho pensato quindi che sia necessario integrare la libreria di Jena, e successivamente dovrei eseguire un query sparql su dbpedia a seconda di un "pattern" creato da me ad esempio :
Se scrivo P(?x,?y) voglio eseguire una query sparql su dbpedia che cerca tutti gli individui (soggetto e oggetto) che hanno una certa proprietà P.

Sparql :
"Select ?x , P , ?y 
  where ?x P ?y "

come dovrei comportarmi con i prefissi? qualcuno è in grado di correggermela e darmi una mano?
credo che nel where vadano le parentesi graffe e che le variabili nel select vadano senza virgole
Select ?x ?y where {?x P ?y}

riguardo ai prefissi sono solo una commodity, nel tuo caso puoi ignorargli. I prefissi vengono espansi in fase di preprocessamento della query e in generale dell'ontologia.

Se vuoi mi trovi su IRC sul server irc.freenode.net, canale #opendatahacklab

Nel caso il pattern fosse costituito da piu parti come questo : P(x,y) Q(x,z)
quindi la query mi cerchera su dbpedia tutte le tuple in cui l'individuo x condivide due qualsiasi proprietà con altri due individui y e z.

NB: per ora il mio scopo è capire le query da fare per 

Ringrazio chiunque riesca a darmi una mano perché sono diversi giorni che non riesco a venirne a capo.
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "Spaghetti Open Data" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a spaghettiopend...@googlegroups.com.
Visita questo gruppo all'indirizzo https://groups.google.com/group/spaghettiopendata.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/spaghettiopendata/b444cf51-d24a-48b6-9f45-32f9e5f6039c%40googlegroups.com.
Per altre opzioni visita https://groups.google.com/d/optout.

a.ge...@studenti.uniba.it

unread,
Aug 18, 2017, 6:58:25 AM8/18/17
to Spaghetti Open Data, cristia...@hackspacecatania.it
Ti ringrazio intanto per avermi risposto, purtroppo però la query non restituisce risultato mi segnala un errore. Mi sto cervellando per capire come poter estrapolare tutti i predicati presenti sul grafo..E successivamente come creare la query per rispettare i pattern, sei in grado di aiutarmi anche in privato?

Marco Brandizi

unread,
Aug 18, 2017, 9:03:02 AM8/18/17
to spaghett...@googlegroups.com

Non ho ben capito cosa tu voglia fare. Mi sembra che l'idea sia che l'utente può fare delle 'faceted query', specificando proprietà di interesse, magari anche dei soggetti iniziali.

Nel caso, l'approccio è permettergli di selezionare cose come le proprietà da un elenco predefinito, che puoi estrarre da schemi/ontologie di interesse, o anche dai dati (vedi sotto). Se fai questo, puoi scegliere di presentare URI e prefissi in modo più user friendly, ad esempio adottando una strategia del tipo:

- se la proprietà ha una label (rdfs:label, dcterms:title), presenti quella

- se non ce l'ha, ma ha uno URI in un namespace noto (es, 'dcterms:description') presenti la forma: prefisso:id <value>, facendo sia prefisso che id cliccabili, in modo da poter aprire un pop-up che riporti la descrizione della proprietà (se presente mediante proprietà tipo rdfs:comment) o un altro che descriva l'ontologia a cui si riferisce il relativo namespace.

- se non c'è niente di tutto questo, magari provi almeno ad abbreviare lo URI, tipo che lo spezzi all'ultima occorrenza di '#' oppure '/'.


Per altri dettagli, vedi sotto.


On 18/08/2017 11:59, a.ge...@studenti.uniba.it wrote:
Se scrivo P(?x,?y) voglio eseguire una query sparql su dbpedia che cerca tutti gli individui (soggetto e oggetto) che hanno una certa proprietà P.

Sparql :
"Select ?x , P , ?y 
  where ?x P ?y "

credo che la forma giusta sia:

select distinct ?x ?y
where { ?x _P_ ?y }

dove, al posto di _P_ devi scrivere correttamente la proprietà che ti interessa, eg. se P=foaf:knows, puoi scrivere o direttamente <http://xmlns.com/foaf/0.1/> (le parentesi angolari delimitano uno URI in SPARQL, oppure scrivi foaf:knows e aggiungi "prefix foaf: <http://xmlns.com/foaf/0.1/>" in testa alla query, prima di select. Se lo fai programmaticamente, fai prima con la prima opzione, la seconda è utile solo se devi presentare la query ad un umano (es, per fare debugging).

Non ha molto senso riportare una costante P nel risultato (nella parte select), ma non sono sicuro di aver capito cosa vuoi fare.



Nel caso il pattern fosse costituito da piu parti come questo : P(x,y) Q(x,z)
quindi la query mi cerchera su dbpedia tutte le tuple in cui l'individuo x condivide due qualsiasi proprietà con altri due individui y e z.

? Se stai cercando tutte le proprietà ?p e ?q che abbiano un soggetto in comune, in SPARQL si farebbe così:

select distinct ?p ?q
{
  ?x ?p ?y.
  ?x ?q ?z.
  filter ( ?p != ?q )
  filter ( ?y != ?z )
}

Ma se il dataset è molto grande (e dbpedia lo è), probabilmente non otterrai una risposta molto significativa, perché in realtà ti interessano le proprietà usate più spesso:

select distinct ?p ?q (count (distinct ?x) as ?ct)
{
  ?x ?p ?y.
  ?x ?q ?z.
  filter ( ?p != ?q )
  filter ( ?y != ?z )
}
group by ?p ?q
order by desc ( ?ct )

ma questa è anche più pesante per da risolvere e la possibilità che questo funzioni dipende dal server, per esempio se ha qualche indice o no. Mi è capitato di discutere di qualcosa del genere di recente: https://goo.gl/XGi1Mf. Qualcuno mi ha suggerito di lavorare col dump dei dati: https://goo.gl/JBPK72, ma neanche questo è facilissimo, perché, se l'endpoint non è tuo, non è facile tirare giù tutti i dati. Però puoi ottenere una stima, se scarichi un po' di triple a caso e poi usi l'approccio suggerito dal link, oppure le ricarichi in qualche altro endpoint (io uso spesso Fuseki) e procedi con query come quella qui sopra.

Ciao,
Marco
-- 

=========================================================================
Marco Brandizi <marco.b...@gmail.com> 
http://www.marcobrandizi.info

Marco Brandizi

unread,
Aug 18, 2017, 9:07:19 AM8/18/17
to spaghett...@googlegroups.com

Dimenticavo:

tool come RelFinder (http://www.visualdataweb.org/relfinder.php) consentono all'utente di iniziare una ricerca selezionando URI si interesse (lui lo fa per soggetti/oggetti, ma il discorso varrebbe anche per le proprietà), ma non si basano sulla costruzione di un elenco di tutte le URI disponibili nel dataset (praticamente impossibile), usano l'autocompletamento: l'utente inizia a scrivere e il componente AJAX interroga il data set cercando pezzi di stringa in URI rdfs:label, e proprietà del genere.

a.ge...@studenti.uniba.it

unread,
Aug 19, 2017, 11:57:48 AM8/19/17
to Spaghetti Open Data
Ti ringrazio davvero per le risposte esaurienti, l'obiettivo è selezionare il grafo di conoscenza (che può essere YAGO o DBpedia ma anche altri) e creare una metaquery generica da parte dell'utente come ho scritto sopra. 
Per esempio, la seguente metaquery

P(?x, ?y), Q(?x, ?z), Q(?y, ?z)
Qui P e Q sono nomi di variabili quindi possono essere istanziati in tanti modi a partire dai dati presenti nel grafo RDF.

serve a cercare le proprietà Q condivise da due individui che sono correlati da P.

una possibile risposta alla metaquery è la seguente (ovviamente è solo una, delle tante tulle presenti nel grafo rdf)

isMarriedTo(?x, ?y), livesIn(?x, ?z), livesIn(?y, ?z)

che si ottiene istanziando la metaquery nel modo seguente: a P sostituisce isMarriedTo e a Q sostituisce livesIn.

E' possibile realizzare una cosa del genere? L'utente non deve specificare alcun URI/label/proprietà, l'unica cosa che deve fare è esplicitare tale pattern.

E' in grado di darmi una mano? Ci sto impazzendo da quasi un mese per capire come poter procedere.

La ringrazio anticipatamente.
-- 

=========================================================================
Marco Brandizi <marco....@gmail.com> 
http://www.marcobrandizi.info


-- 

=========================================================================
Marco Brandizi <marco....@gmail.com> 
http://www.marcobrandizi.info

Reply all
Reply to author
Forward
0 new messages