- From: Steve Harris <steve.harris@garlik.com>
- Date: Fri, 8 May 2009 15:20:50 +0100
- To: Lee Feigenbaum <lee@thefigtrees.net>
- Cc: SPARQL Working Group <public-rdf-dawg@w3.org>
On 8 May 2009, at 15:12, Lee Feigenbaum wrote:
> Steve Harris wrote:
>> On 8 May 2009, at 05:40, Lee Feigenbaum wrote:
>>> It seems to me that ARQ's behavior is simple and avoids this
>>> problem, but I'm not sure at what cost. My natural inclination is
>>> that its valuable for queries & their subqueries to be able to
>>> target different graphs.
>>>
>>> Current recommendation? Unsure.
>>>
>>> Suggested next steps? Determine whether we have reasonable use
>>> cases to require that subqueries can target different datastes
>>> from parent queries.
>> Good summary.
>> For the record, I think it makes most sense to ban FROM in
>> subqueries.
>> The specification of FROM is a little unclear in my mind, but by my
>> understanding it should be possible to rewrite any sub-FROM'd query
>> using GRAPH, eg. if you want to ask something like:
>> FROM <a>
>> SELECT ?x WHERE {
>> ?x a :Person .
>> {
>> FROM <b>
>> SELECT ?x, ?z WHERE {
>> ?x :knows ?z
>> }
>> }
>> }
>> you could also write something like:
>> FROM <a>, <b>
>> SELECT ?x WHERE {
>> GRAPH <a> { ?x a :Person }
>> {
>> SELECT ?x, ?z WHERE {
>> GRAPH <b> { ?x :knows ?z }
>> }
>> }
>> }
>> Possibly you need to use FROM NAMED, not FROM.
>
> In this case, yes, but I think if your subquery is relying on the
> FROM merging together multiple graphs, then you can't recast it in
> this way.
>
> (I can try to come up with an example later, but the key point is
> that FROM lets you write down triple patterns that can span multiple
> 'input' graphs without knowing ahead of time which triple patterns
> match from which graph. FROM NAMED and GRAPH end up requiring that
> the triple patterns inside GRAPH { ... } all match a single named
> graph.
Yes, that's true, I avoid doing a hard case for that reason, it would
be horribly verbose in the worst case, something like:
SELECT ?x, ?z WHERE {
GRAPH ?g1 { ?x :knows ?z }
GRAPH ?g2 { ?x :foo :bar }
FILTER(?g1 IN (<a>, <b>, <c>) && ?g2 IN (<a>, <b>, <c>))
}
and so on. I never said it was pretty :)
- Steve
Received on Friday, 8 May 2009 14:21:29 UTC