That would better. VALUES (?x) causes there to be a solution set to be joined in the algebra expression. VALUES is syntax, substitute() works on algebra expressions.

substitute() is also affected by scoping which the definition ignores and shouldn't. Inner SELECTs and a WHERE with non-projected ?x is really a different variable.

I've put these the W3C SPARQL errata to be fixed whenever.

        Thanks
        Andy

On 23/12/14 20:55, Daniel Hernández wrote:
The specification says "EVERY occurrence":

substitute(pattern, μ) = the pattern formed by replacing every
occurrence of a variable v in pattern by μ(v) for each v in dom(μ)

However,  I guest that it must be only occurrences in basic graph
patterns. For example, let us to consider the pattern:

P =  VALUES (?x) { ("a") }

What is the result of substitute(P, {?x: "x"})?

If I substitute every occurrence, then I will get:

VALUES ("x") { ("a") }

But the domain of mappings is limited to variables. So I guest that the
result must be:

VALUES (?x) { ("a") }

Lets consider P2 = {:s :p ?x} . VALUES (?x) { ("a") }. Then, I guest
that substitue(P2, {?x: "x"}) must be:

{:s :p "x"} . VALUES (?x) { ("a") }


On Tue, 2014-12-23 at 20:22 +0000, Andy Seaborne wrote:
The formal description is the helper operation 'Substitute'

http://www.w3.org/TR/sparql11-query/#defn_substitute

and the evaluation text just below that.  SERVICE isn't special in
anyway (whether it should be is whole different question!).

        Andy

On 23/12/14 19:50, Daniel Hernández wrote:
The motivation of my question was to confirm that occurrences of ?x must
be replaced by bindings in each of the solutions before sending the
query to another service. But I do not found a simpler way to write that
question. That's all.

Thanks!
Daniel

On Tue, 2014-12-23 at 18:49 +0000, Andy Seaborne wrote:
   >> What will be the result of this query?

Empty.

Firstly - the <a> in the query is highly unlikely to be the same <a> as
the data because the query and data have different base URIs. thsi
appies to the SERVICE and non-SERVICE cases.

The URI resolution of the query is at parse time so <p> inside the
SERVICE is the same <p> in the triple pattern

Adding a stable BASE, I get no results with Fuseki2 because the EXISTS
?x is substituted from the pattern.

The Fuseki2 log shows a call back of:

Query = SELECT  * WHERE   { <http://example/b> <http://example/p>
<http://example/c>}

which I guess is the core of your question?

        Andy

----------------------------
BASE <http://example/>
<a> <p> <b> .
<a> <q> <c> .
----------------------------
BASE <http://example/>

SELECT *
WHERE {
      { <a> <p> ?x }
      FILTER (
        EXISTS { SERVICE <http://localhost:3030/ds/query> { ?x <p> <c> } }
        )
}
----------------------------




On 23/12/14 15:04, Miguel Bento Alves wrote:
Daniel,

what is the point?

You didn’t clear if you have also a local dataset, but I think that the answer 
is the same, the result is empty. Why should be different?

(in this situations, normally, I test. Seeing is believing :) ).

In your dataset, instead of <a> <q> <c> you mean <a> <p> <c>?

Miguel



On 23 Dec 2014, at 14:34, Daniel Hernández <[email protected]> wrote:

Hello,

Let us consider a service <s> which default dataset contains the default
graph:

<a> <p> <b> .
<a> <q> <c> .

Let us consider the following query to be evaluated with the service <s>
described above:

SELECT *
WHERE { { <a> <p> ?x } FILTER ( EXISTS ( ?x <p> <c> ) ) }

I suppose that in this case the filter clause is evaluated for each
solution of the graph pattern on the left. Thus, it is evaluated for
{?x:<b>} and {?x:<c>}. Then the clauses will be:

{?x:<b>} --> EXISTS ( <b> <p> <c> )    (FALSE)
{?x:<c>} --> EXISTS ( <c> <p> <c> )    (FALSE)

Then, the result of this query will be empty.

Let us to consider the following query:

SELECT *
WHERE { { <a> <p> ?x }
          FILTER ( EXISTS ( SERVICE <s> { ?x <p> <c> } ) ) }

What will be the result of this query?

Regards,
Daniel









Reply via email to