Domanda

Sto cercando di usare Sparql per un compito relativamente semplice: dato un grafico FOAF, vorrei analizzare gli elementi che trovo lì dentro, ottenere i loro tag (se esistono) e poi usali come nuovi grafici da cui a Trova informazioni su quelle persone.

Quindi, ad esempio, potresti immaginare un semplice caso d'uso in cui voglio eseguire una query Sparql per elencare tutti i miei cibi preferiti (secondo il mio file foaf) e anche i cibi preferiti di tutti i miei amici.

Ecco come appare in questo momento. Si noti che ai fini del test, al momento tutto quello che sto cercando di fare con la query di seguito è prendere il nome dell'amico, attraverso la variabile? Name3. L'esecuzione di questa query non restituisce alcun risultato per? Grafico e? Nome3, anche se so che il collegamento RDFS: Seealso ad alcuni file RDF validi, di cui almeno due dovrebbero avere un attributo Nome. Grazie per qualsiasi input che potresti avere!

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?graph ?name3
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .
        GRAPH ?graph {
            ?person3 foaf:name ?name3 .         
        }   
    }       
}
È stato utile?

Soluzione

Il grafico non prendono implicitamente dati remoti nel negozio, sarebbe troppo un rischio per la sicurezza. Potrebbero esserci alcuni sistemi in cui è possibile abilitarlo, ma non è standard.

Tuttavia, nell'aggiornamento di Sparql 1.1, c'è un caricamento delle parole chiave, che lo fa, puoi scrivere:

LOAD <uri>

Che prenderà il grafico nel negozio, in modo da poter scrivere:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?graph
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .   
    }       
}

Nutri i legami per? Grafico in un set di istruzioni di carico, quindi eseguire la query originale.

NB In alcuni sistemi, ad esempio 4store devi abilitare il caricamento, non è consentito per impostazione predefinita, quindi controlla la documentazione del negozio che stai utilizzando.

Altri suggerimenti

Invece di usare il carico, una volta scoperti i grafici che devi includere, secondo l'esempio di Steve sopra, non sarebbe ragionevole usare in alternativa da denominato, indicando tutti i grafici pertinenti nella query risultante IE

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?name3
FROM <my-rdf-file>
FROM NAMED <discovered-graph-URI-1>
FROM NAMED <discovered-graph-URI-n>
WHERE { 
GRAPH <my-rdf-file> {
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
 }
    OPTIONAL { 
        ?person2 rdfs:seeAlso <discovered-graph-URI-1> .
        GRAPH <discovered-graph-URI-1> {
            ?person3 foaf:name ?name3 .         
        }   
        ?person2 rdfs:seeAlso <discovered-graph-URI-n> .
        GRAPH <discovered-graph-URI-n> {
            ?person3 foaf:name ?name3 .         
        }  
    }       
}

In questo modo ti aggiri i problemi di sicurezza e non devi mantenere i dati nel tuo triplestore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top