2011-08-17 6 views
20

Ho bisogno di un po 'di aiuto selezionando il triple giusti dal mio deposito ....selezione utilizzando SPARQL in base a 'tripla non esiste'

<a> a <type/1> . 
<b> a <type/1> . 
<c> a <type/1> . 
<c> a <type/2> . 

voglio selezionare solo gli elementi che sono di tipo/1 e non type/2

Qual è il modo migliore per ottenere ciò utilizzando una query di selezione sparql?

Cerco omething come:

select ?a where 
{ 
    ?a a <type/1> . 
    !{ ?a a <type/2> } 
} 

Grazie,

:)

risposta

23

Un'alternativa SPARQL 1.1 soluzione è quella di utilizzare MINUS esempio

SELECT ?a 
WHERE 
{ 
    ?a a <type/1> . 
    MINUS { ?a a <type/2> . } 
} 

MINUS sottrae soluzioni che corrispondono il suo modello a tre tra le corrispondenze esistenti.

Nella maggior parte dei casi utilizzando FILTER NOT EXISTS { } e MINUS { } sono equivalenti ma attenzione ci sono alcuni casi angolo dove questo non è vero - vedi la SPARQL 1.1 specification per alcuni esempi di questo.

12

In SPARQL 1.0 che è un po 'complicato:

SELECT ?a WHERE { 
    ?a a <type/1>. 
    OPTIONAL { 
     ?a a ?othertype . 
     FILTER (?othertype = <type/2>) 
    } 
    FILTER (!BOUND(?othertype)) 
} 

La clausola OPTIONAL lega ?othertype per qualsiasi ?a che ha <type/2> e lo lascia non associato per qualsiasi ?a che non ce l'ha.

L'ultimo FILTER quindi seleziona solo le righe in cui ?a non è stato lasciato.

In SPARQL 1.1 è molto più semplice:

SELECT ?a WHERE { 
    ?a a <type/1>. 
    FILTER NOT EXISTS { ?a a <type/2> . } 
} 
+0

cambiato il tuo SPARQL 1.1 esempio per uso esplicito URI nel 'NON EXISTS' come utilizzando una variabile sarebbe anche corrispondere al' ' triplica il primo pattern trovato e il risultato in filtrando tutte le soluzioni – RobV

+0

Grazie per questo RobV! – cygri

Problemi correlati