2013-03-10 14 views
9

Un tipico di query SPARQL che specifica un grafico potrebbe assomigliare a questo:esegue una query sparql su due grafici?

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 

Questo mi dirà tutte le triple di AliceIRI dove "foo" è un soggetto. Cosa succede se voglio guardare in due grafici differenti, è la mia unica opzione per fare un UNION:

SELECT ?b ?c WHERE {{ GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 
UNION 
{ GRAPH <http://BobIRI> { 
<http://local.virt/foo> ?b ?c}}} 

O c'è qualche scorciatoia che mi permettesse di scrivere questo più comodamente, qualcosa di simile:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c} 

BTW Sono su Virtuoso 6.01.3127.

Update 1

Per chiarire, mi piacerebbe davvero essere in grado di eseguire:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c . 
<http://local.virt/bar> ?b ?c}} 

e hanno questa partita ?b e ?c tale che <http://local.virt/foo> ?b ?c è in <http://AliceIRI> e <http://local.virt/bar> ?b ?c è in <http://BobIRI>. Prendendo semplicemente l'unione delle partite in <http://AliceIRI> (solo) e <http://BobIRI> (da solo) non riuscirai a farlo.

E per chiarire ulteriormente: ho capito che se i Foos appartenevano tutti ad Alice e le barre appartenevano tutti a Bob, quindi ho potuto scrivere

SELECT ?b ?c WHERE { 
GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c } . 
GRAPH <http://BobIRI> { 
<http://local.virt/bar> ?b ?c}} 

(che in realtà è quello che mi serviva per la mia applicazione) - ma almeno per "interesse accademico" rimane la questione se esista un modo sintatticamente bello di eseguire una query contro un'unione di grafici (rispetto a più grafici e quindi unione dei risultati).

risposta

7

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
WHERE 
{ 
    GRAPH ?g { <http://local.virt/foo> ?b ?c } 
} 

FROM NAMED clausole possono essere utilizzati per impostare grafo nominato che vengono interrogati quando si utilizza una clausola GRAPH ?var.

E 'importante notare che semanticamente questa query è identico a quello che hai scritto sopra in modo che il modello espresso dalla clausola di GRAPH viene confrontato ogni grafico chiamato separatamente e unioned insieme

Modifica

Per rispondi alla domanda extra nel tuo commento sì, se usi FROM invece di FROM NAMED questo imposta il grafico predefinito per la query in modo che sia l'unione di tutti i grafici nelle clausole FROM e non richieda l'utilizzo di GRAPH es.

SELECT ?b ?c 
FROM <http://AliceIRI> 
FROM <http://BobIri> 
WHERE 
{ 
    <http://local.virt/foo> ?b ?c 
} 

Questo copre il caso in cui si desidera consentire triple che corrispondono a diverse parti del modello tripla provenire da qualsiasi dei grafici che hai chiamati.

Si noti che alcuni negozi tripli potrebbero consentire di impostarli in modo che il grafico predefinito venga automaticamente considerato come unione di tutti i grafici nominati.

+1

Se questo ai raccordi i risultati attraverso grafici, piuttosto che permettere gli schemi triple da trarre da triple in vari grafici, quindi è un po 'di un corpo contundente. Puoi chiarire se questo è l'unico strumento disponibile (vedi Aggiornamento 1 sopra). –

+1

@JoeCorneli Ho aggiornato la mia risposta, sì puoi farlo con una domanda leggermente diversa – RobV

+0

meravigliosa, grazie per l'aggiunta. –

1

Se è necessario eseguire una query in un sottoinsieme dei grafici che si sta utilizzando, è anche possibile impostare un filtro sull'iri dei grafici.

es:

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
FROM NAMED <http://CarlIri> 
WHERE { 
GRAPH ?g { 
    <http://local.virt/foo> ?b ?c 
    FILTER(?g=<http://AliceIRI> || ?g=<http://BobIri>) 
} 
}