CONSTRUCT / template merging.


In email, you were asking about CONSTRUCT:

Pat wrote:
 >>There is one case that Im a bit puzzled about, which is the
 >>CONSTRUCT answer where all the various answers are merged into a
 >>single answer (Is that right? It took me a while to figure out that
 >>is what was meant here, and I might not have it right.) So for
 >>example suppose the target  graph is
 >>bill loves _:who .
 >>joe loves _:who .
 >>and the query is
 >>construct * where ?x loves ?y
 >>Now, as I understand it (and the definitions I sent say) , the
 >>result will be the graph merge of two sub-answers, which will
 >>themselves in this case be
 >>   bill loves _:who . (first answer binding ?x/bill, ?y/_:who)
 >>joe loves _:who . (second answer binding ?x/joe, ?y/_:who)
 >>But the merge of these will require the bnodes in the two
 >>sub-answers to be separated, so that one will get something like
 >>bill loves _:a
 >>joe loves _:b
 >>as the result graph in this case, which loses some information that
 >>was in the target. Is that what was intended? If not, the
 >>definitions need to be tweaked.

The intent of the CONSTRUCT is that it should not create two different bNodes:

---- Data:
@prefix : <> .

<bill> :loves _:who .
<joe>  :loves _:who .
---- cwm rule:
@prefix : <> .

{ ?x :loves ?y } => { ?x :knows ?y } .

and with cwm I get:

<bill> :knows _:who .
<joe>  :knows _:who .

that is, same bNode. Which, in SPARQL, is:

CONSTRUCT ( ?x :knows ?y )
WHERE ( ?x :loves ?y )

I see that "merge" is not the right language.  Would this be better?

The answer to a CONSTRUCT query:


where pat1 is a basic pattern is the set of RDF triples X formed by the union of 
S(pat1) for all substitutions S where S is a solution of pat2.

(a "solution" = "answer substitution" in your definitions)

Now "CONSTRUCT * WHERE pattern" is supposed to be a shorthand for using the 
pattern as the template:

"CONSTRUCT pattern WHERE pattern"


Received on Friday, 10 December 2004 17:51:41 UTC