Lee seems to have a particular skill with this kind of thing. Its clear that not everyone else does, which I take to mean that the SPARQL language needs
some kind of extension to make this easier for others.

The semantics needed here is a universal quantifier combined with
a negation-as-failure assumption.  I'm not recommending a fix, because,
while I'm a fan of negation as failure, I'm also partial to leaving
universal quantification out of SPARQL.

But for comparison, we implement a version of OWL that assumes
negation-as-failure semantics for the ALLVALUESFROM (which
we abbreviate as "ALL").  So we would write
    CLASS ex:OnlyA = (all rdf:type ex:A)
to get the desired semantics.  Simple; easy for users to understand.

The query would be

select ?x
where {?x rdf:type ex:OnlyA}

The expansion into rules yields a doubly-nested negation, which
is pretty much the same as Lee's solution.

Cheers, Bob

On Feb 1, 2008, at 1239, Leigh Dodds wrote:


This should work:

SELECT ?x {
   ?x a ex:A .
   OPTIONAL {
     ?x a ?type .
     FILTER(?type != ex:A)
   }
   FILTER(!bound(?type))
}

The OPTIONAL here tries to find a different type for the same resource (?x). If it succeeds then ?type is bound to a second class, so we filter
out that case at the top-level.

And it does. I just ran it twinkle and it produces the expected
single result.

Nice work. I spent a long time scratching my head with that one.
Didn't occur to me to split the FILTERs into the separate OPTIONAL
patterns.

Fun!

L.


Bob MacGregor
Chief Scientist
Siderean Software, Inc.
310.647.5690
[EMAIL PROTECTED]


Reply via email to