W3C home > Mailing lists > Public > public-sparql-dev@w3.org > April to June 2010

Re: Union in Construct

From: Andy Seaborne <andy.seaborne@talis.com>
Date: Thu, 17 Jun 2010 16:36:10 +0100
Message-ID: <4C1A40EA.7050108@talis.com>
To: "Buikstra, A.P.F." <a.p.f.buikstra@student.vu.nl>
CC: "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>


On 17/06/2010 10:33, Buikstra, A.P.F. wrote:
> Hi guys,
>
> Iím using a construct query to extract a specific portion of RDF from
> LDSR. Iím creating these queries automatically, by the following
> transformation:
>
> Select ?a
>
> Where { ?a ?b ?c }
>
> ->
>
> Construct {?a ?b ?c}
>
> Where {?a ?b ?c}
>
> There are a few trivialities, such as Filters which have to be removed,
> but this turned out not to be an issue. The problem is when Union comes
> into the were, the idea no longer works:
>
> Construct { {?a ?b ?c} UNION {?a ?d ?c}}
>
> Where { {?a ?b ?c} UNION {?a ?d ?c}}
>
> Would give an error.
>
> My question is, can I just do:
>
> Construct { ?a ?b ?c .
>
> ?a ?d ?c}
>
> Where { {?a ?b ?c} UNION {?a ?d ?c}}
>
> It seems to work okay, but it doesnít feel completely right. It comes
> down to whether the engine would try to construct both -?a ?b ?c- and
> -?a ?d ?c- given the data, or either. Is there a better way to tackle my
> problem?
>
> All help appreciated!
>
> Arjon Buikstra
>
> (Working with Larkc at the VU and MPIB)


The "CONSTRUCT { ?a ?b ?c . ?a ?d ?c}" works in this case because there 
is a variable in one side and not the other.  That means either ?a ?b ?c 
or ?a ?d ?c in the CONSTRUCT has an unbound variable and so the triple 
generation is for this triple (not the other one) is skipped.

This does not generalise (as you found with FILTER) but you can do some 
things with multiple constructs for each branch of the union and if the 
union is nested you need be able to rewrite into a disjunctive normal form.

	Andy
Received on Thursday, 17 June 2010 15:36:50 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:15:50 UTC