2013-04-15 8 views
10

Ho una domanda SPARQL come questoSpecificare rdf multipla: i tipi in una query SPARQL

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE 
{ 
    ?x rdf:type ?type . 
} 

Supponiamo ora voglio specificare il tipo di ?type come sia prefix:type1 o prefix:type2; Come dovrebbe essere fatto?

risposta

10

È possibile utilizzare UNION ad es.

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE { 
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 } 
} 

noti l'uso di a che è una parola SPARQL che può essere utilizzato in posizione predicato e corrisponde al tipo RDF URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type

Ci sono altri modi per fare questo come l'utilizzo FILTER clausole con varie espressioni:

  • serie di ?type = prefix:type1 combinati con la condizionale o l'operatore ||
  • ?type IN (prefix:type1, prefix:type2)

Oppure si potrebbe usare una clausola VALUES per specificare le opzioni per ?type

Questi possono essere meglio se la query è più complesso e non si vuole duplicare gran parte della query su entrambi i lati del UNION o avere più di due possibilità da considerare.

+0

"il? Type in" sembra interessante, ma non funziona, sto sicuramente facendo un errore sulla sintassi, giusto? SELEZIONA * DOVE { ? X rdf: tipo? Tipo ? Digita (wo: Kingdom, wo: Phylum) } – Noor

+2

Queste sono espressioni che possono essere utilizzate in una clausola 'FILTER' in modo che sia' FILTER (? digita IN (wo: Kingdon, wo: Phylum)) ' – RobV

9

Molto più veloce della funzione FILTER IN è l'uso di BINDINGS. Consiglio vivamente di utilizzare qualcosa sulla falsariga della seguente query piuttosto che sullo FILTER(?type IN (wo:Kingdon, wo:Phylum).

SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)} 

Uso BINDINGS permette al motore SPARQL per limitare i risultati come viene elaborato anziché restituire i risultati prima di filtrare. Ciò rende la restituzione dei risultati molto più veloce.

+4

Non è più BINDINGS; è VALORI. Questo approccio è più bello di quello che usa UNION, però, e più bello di usare FILTER (? Type IN ...). –

2

Si potrebbe farlo utilizzando la sintassi del filtro, in questo modo:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX prefix: <http://example.org/ns#> 

SELECT ?s ?p ?o ?type 
WHERE { 
    ?s a ?type . 
    ?s ?p ?o . 
    FILTER(?type IN (prefix:Type1, prefix:Type2)) 
} 

prega di notare che non posso garantire l'efficienza, come io non so se il filtraggio si applicherà dopo che tutti i risultati saranno restituiti o non.

Problemi correlati