Title: ARQ - Negation Standard SPARQL can perform negation using the idiom of `OPTIONAL`/`!BOUND`. It is inconvenient and can be hard to use as complexity increases. ARQ supports additional operators for negation. This is syntactic extension and is available if the query is parsed with language `Syntax.syntaxARQ`. # Names of people who have not stated that they know anyone PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . OPTIONAL { ?x foaf:knows ?who } . FILTER (!BOUND(?who)) } In ARQ, there is the `NOT EXISTS` operator (`UNSAID` is an alias for `NOT EXISTS`) which acts at the point in the query where it is written. It does not bind any variables but variables aready boudn in the query will have their bound value. # Names of people who have not stated that they know anyone PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . NOT EXISTS { ?x foaf:knows ?who } } There is also an `EXISTS` operator. # Names of people where it is stated that they know at least one other person. PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . EXISTS { ?x foaf:knows ?who . FILTER(?who != ?x) } } In this example, the pattern is a little more complex. Any graph pattern is allowed although use of `OPTIONAL` is pointless (which will always match, possible with no additional results). `NOT EXISTS` and `EXISTS` can also be used in `FILTER` expressions. In SPARQL, `FILTER` expressions act over the whole of the basic graph pattern in which they occur. # Names of people who have not stated that they know anyone PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . FILTER (NOT EXISTS { ?x foaf:knows ?who }) } A note of caution: PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . FILTER (NOT EXISTS { ?x foaf:knows ?y }) ?x foaf:knows ?who } is the same as (it's a single basic graph pattern - the filter does not break it in two): PREFIX foaf: SELECT ?name WHERE { ?x foaf:givenName ?name . ?x foaf:knows ?y . FILTER (NOT EXISTS { ?x foaf:knows ?who }) } and the `FILTER` will always be false (`{ ?x foaf:knows ?y }` must have matched to get to this point in the query and useing ?who instead makes no difference). [ARQ documentation index](index.html)