2013-03-03 18 views
9

Sembra che non esegua query DESCRIZIONE SPARQL. Ho bisogno di recuperare i grafici completi delle risorse che corrispondono a una condizione. Su un endpoint SPARQL ho provato (Norwegian Rådata Na, http://data.bibsys.no/data/query_authority.html) questo funziona bene:query DESCRIZIONE SPARQL

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

DESCRIBE ?person WHERE { 
    ?person rdf:type foaf:Person . 
    FILTER EXISTS { ?person owl:sameAs ?sameAs } 
} 
LIMIT 100 

ottengo un risultato con le risorse alle persone che dispongono di un gufo: sameAs triple.

Su altri endpoint SPARQL, Onki Luce (http://sparql.onki.fi/sparql.tpl) e DBPedia (http://dbpedia.org/sparql) una query simile

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

DESCRIBE ?x WHERE { 
    ?x rdf:type skos:Concept . 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
} 
LIMIT 100 

restituisce un sacco di risorse che non hanno né rdf: type = CSIAS: Concept, né uno skos: prefLabel, così Ovviamente non sto facendo la query correttamente. Come dovrebbe essere detto questo tipo di query per produrre il risultato che mi serve?

risposta

10

I "risorse ricevute" senza skos:prefLabel o skos:Concept sono probabilmente relative a una risorsa che soddisfi le vostre esigenze.

La query SPARQL DESCRIBE non restituisce effettivamente le risorse corrispondenti al modello grafico della query, ma un grafico RDF che "descrive" tali risorse. Spetta al servizio sparql scegliere quali triple includere per descrivere una risorsa. (Si veda la norma sotto)

Il W3C Proposed Recommendation on SPARQL 1.1 dice:

Il DESCRIVERE modulo restituisce un singolo risultato RDF grafico contenente dati RDF sulle risorse. [...] La descrizione è determinata dal servizio query.

Così, i risorse che inaspettatamente riceve forse che descrive le risorse che realmente desidera. Per indagare sul problema: controlla le triple che dovresti effettivamente ricevere per una relazione con la tua risorsa ricercata. Un buon modo è iniziare con LIMIT 1 per vedere l'effetto delle query DESCRIBE.

Forse una query SELECT è quello che ti serve? Restituisce solo le risorse corrispondenti al modello del grafico.

+0

Grazie! Ho provato DESCRIBE e ho ottenuto la risorsa prevista e un mucchio di risorse correlate, proprio come si scrive. SELECT o CONSTRUCT non sono opzioni praticabili nel caso in esame, in quanto non conosco l'effettiva struttura dei dati. Ma, sapendo quali sono le risorse "extra", posso semplicemente ignorarle quando elaborerò il risultato. –

1

SELEZIONA o la costruzione non sono opzioni praticabili nel caso in esame, come io non conosco la struttura effettiva dei dati

Perché dici questo? Penso che si sia desidera ottenere solo le risorse:

select ?x WHERE { 
    ?x rdf:type skos:Concept . 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
} 
LIMIT 100 

o tutte le loro triple in uscita:

select ?x ?p ?y WHERE { 
    ?x rdf:type skos:Concept. 
    FILTER EXISTS { ?x skos:prefLabel ?prefLabel } 
    ?x ?p ?y 
} 
LIMIT 100 
+0

Grazie! Ho provato qualcosa del genere ma ho sbagliato la sintassi SPARQL. Il prossimo numero è il modo migliore per costruire un grafico reale dal risultato XML SPARQL. –

1

Come affermato da @Thomas, DESCRIBE è underspecified un po 'dalla norma, quindi, si farà ottenere risultati incoerenti. Tuttavia, utilizzando CONSTRUCT, è possibile restituire quello che molti motori restituiranno per DESCRIBE, vale a dire l'SPO più OPS e farlo in modo coerente tra i servizi.Ecco una query che fa questo:

CONSTRUCT { 
    ?person ?p ?o . 
    ?s ?p1 ?person . 
} 
WHERE { 
    ?person rdf:type foaf:Person . 
    FILTER EXISTS { ?person owl:sameAs ?sameAs } . 
    ?person ?p ?o . 
    ?s ?p1 ?person . 
} 

In questo modo si ottiene un grafico RDF che "descrive" le risorse destinate a ?person, vale a dire tutte le proprietà di ?person e tutte le proprietà il cui valore (oggetto) è persona?.

+0

Interessante! Ho provato questo su dbpedia (l'endpoint Rådata Nå SPARQL al momento non funziona): PREFIX rdf: PREFIX skos: COSTRUIRE { ? concept? p? o. ? S? P1? Concetto. } DOVE { ? Concept rdf: type skos: Concept. FILTRI ESISTENTI {? Concept skos: prefLabel? PrefLabel}. ? Concept? P? O. ? S? P1? Concetto. } LIMIT 100 Con risultati misti. Alcuni dati sono proprio ciò che voglio, altri non soddisfano le condizioni. –

+0

Prova ad aumentare il LIMIT. SPARQL non otterrà dati in alcun ordine specifico, quindi potresti anche provare le combinazioni LIMIT/OFFSET con ORDER BY. – scotthenninger