- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Sun, 19 Sep 2004 14:04:01 +0100
- To: Steve Harris <S.W.Harris@ecs.soton.ac.uk>
- Cc: public-rdf-dawg@w3.org
Steve Harris wrote:
> On Fri, Sep 17, 2004 at 02:42:37AM -0700, Rob Shearer wrote:
>
>>A user wishes to find all the people who are either of type dog owner or own a
>> pet who is a dog. The common case of no inferencing this is a pretty
>> realistic query.)
It does seem to be a reasonable query. The contrast we have is between
the implementation view and the application writer view. I'd like to see
queries express what the app writer wants.
>> Some sample data:
>>
>>Rob type Person
>>Eddie type Person
>>Eddie type DogOwner
>>Mitch type Person
>>Mitch hasPet Fido
>>Fido type Dog
>>
>>query
>>
>>select $x
>>where ($x type Person)
>> (($x type DogOwner) OR
>> (($x hasPet $y) ($y type Dog))
>>
>>Is this query correct?
>
>
> Looks good to me, an OPTIONAL equivalent would be:
>
> SELECT $x
> WHERE ($x type Person)
> OPTIONAL ($x type $typeA)
> OPTIONAL ($x hasPet $y) ($y type $typeB)
> AND $typeA = DogOwner || $typeB == Dog
Steve,
Would I be right in assuming the AND filters everything from the
WHERE/OPTIONAL/OPTIONAL?
I'm curious as to what happens when expressions involve unbound variables?
Suppose unbound causes a evaluation error and the query solutiuon is
rejected (this is the usual model for 3-state to 2-state logic - undef
becomes false, any expression involving undef is undefined itself). [I
would strongly prefer the rule here that does depend on evaluation context
wherever possible.]
If the data is just:
Rob type Person
Mitch type Person
Mitch hasPet Fido
Fido type Dog
then one query solution is:
?x=Mitch ; ?y=Fido ; ?typeB=Dog // second optional clause
then the expression
?typeA = DogOwner || ?typeB == Dog
and has ?typeA undefined.
I think there would need to be a guard function "defined(?x)". The
shortest expression I came up with is:
AND ( defined($typeA) && $typeA == DogOwner )
||
( defined($typeB) && $typeB == Dog )
This is really testing for which branch the solution when down.
It took a while to work out (maybe my brian isn't in gear) - I wrote out
all the cases and reduced the larger expression.
And that suggests:
SELECT $x
WHERE ($x type Person)
[ ($x type $typeA) AND $typeA = DogOwner ]
[ ($x hasPet $y) ($y type $typeB) AND $typeB == Dog ]
AND defined($typeA) || defined($typeB)
working by having a test to see that the query went down at least one
branch. That is the sort of thing a query optimizer might do with the
original OR if the language had OR with the implementation changing to
OPTIONAL as a query plan possibility.
I find the OR query more natural because it was more directly what the
question was.
Andy
>
> [OT note] I found using $'s for this query quite distracting.
Certainly a case for one or (as in XOR!) the other
>
> - Steve
>
Received on Sunday, 19 September 2004 13:04:34 UTC