Search code examples
rdfsparqltriplestoretriples

selecting using sparql based on 'triple does not exist'


I need a little help selecting the right triples from my store....

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

i want to select only elements which are type/1 and not type/2

What is the best way to achieve this using a sparql select query?

am looking for omething like:

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

Thanks,

:)


Solution

  • An alternative SPARQL 1.1 solution is to use MINUS e.g.

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

    MINUS subtracts solutions that match its triple pattern from the existing matches.

    In most cases using FILTER NOT EXISTS { } and MINUS { } are equivalent but beware there are some corner cases where this is not true - see the SPARQL 1.1 specification for some examples of this.