# Re: Another attempt...

From: Andrew Newman <andrewfnewman@gmail.com>
Date: Wed, 26 Mar 2008 04:00:03 +1000
Message-ID: <2db5a5c40803251100p10cf0fd1w3337454e9dea67d0@mail.gmail.com>
To: "Seaborne, Andy" <andy.seaborne@hp.com>

```On 25/03/2008, Seaborne, Andy <andy.seaborne@hp.com> wrote:
> In [2008Mar/0013] there is a complete worked example with "UNION {}" and it shows how the results are obtained by referencing the SPARQL specification at each step.  The purpose of the example in [2008Mar/0013] is so we can find the first point of difference or first point where pre-requisite knowledge [2008Mar/0029] is used.
>

Here are a list of my suggestions.

Renaming Ù0 to Ù1 and Ù0 becomes:
"Write Ù0 for the multiset consisting of no mappings, with cardinality
0.  It's not expressible in SPARQL syntax.  It is the UNION identity."

The definition of Ù1 (currently Ù0):
"Write Ù1 for the multiset consisting of exactly the empty mapping ì0,
with cardinality 1. This is the join identity, it is the empty graph
pattern and as a solution mapping it is represented as { {} }".

If you don't like having Ù0 it doesn't matter - please consider the
new definition of Ù1 (the old Ù1) separately.

Maybe make it clear that in SPARQL:
* X JOIN Ù1 = X and X UNION Ù0 = X but that
* X UNION Ù1 != Ù1 and X JOIN Ù0 != Ù0.

Another confusion with UNION in the SPARQL specification was the
difference between it and the Perez paper - set union not multiset/bag
union.  The specification switches between multiset and set union when
one definition would've done.  But I think that's probably outside the
scope of the changes.

Other changes not related to UNION.

I'd also change in 12.3:
"Two solution mappings ì1 and ì2 are compatible if, for every variable
v in dom(ì1) and in dom(ì2), ì1(v) = ì2(v)."

Again, maybe add the stuff from the Perez paper about two disjoint
domains and ì0 being compatible with everything - much less to derive
- I was doing set membership instead (as that is what occurs in
relational JOIN) - which seems very dumb now but it wasn't clear at
the time - I haven't been able to misinterpret the Perez paper in the
same way.  Using "for every" is a standard but maybe "for all" makes
it a bit more clear.

>  In [2008Mar/0015] you said of that example:
>
> """
>  It simple to evaluate you don't need any
>  steps if you are UNIONing the identity for JOIN.
>  """
>
>
> I can't find mention of this - which text in the definition of the evaluation of UNION does this refer to?  (For quick reference: the specification gives the definition for union of two solution multi-sets at [1]; the join identity is the multiset {{}}, cardinality 1. (sec 12.3) - I can work through that point if that would help.)
>

This refers to my completely made up definition which had to abide by
incorrect definitions of Ù0, identities and compatibility based on
previous notions about relations and misunderstanding the
specification.

>
>  If you are raising a test case against the text of the specification, could you work through the example in [2008Mar/0013] so we can identify the step or steps where you differ from the description in that message.
>

I think we now agree on the results of your example.

Here are 5 extra tests that I'm suggesting to add.  This hopefully
clarifies and makes normative the specification from the test suite.
Hopefully my results are understandable - I haven't used a standard
syntax.

Test 1
=====
This test is to show that in the empty graph pattern (5.2.1) is the
JOIN identity (12.3) as mentioned at the end of 12.3.1.

Data:
:a :b :c .
:x :y :z

Query:
SELECT * WHERE { { ?s ?p ?o } . {} }

Results:
( [ ?s = :a, ?p = :b, ?o = :c ],
[ ?s = :x, ?p = :y, ?o = :z]
)

Test 2
=====
This is to show that UNION of a graph and the empty graph pattern
returns all the elements in the graph plus one extra result (ì0).

Data:
:a :b :c .
:x :y :z

Query:
SELECT * WHERE { { ?s ?p ?o } UNION {} }

Results:
( [ ?s = :a, ?p = :b, ?o = :c ],
[ ?s = :x, ?p = :y, ?o = :z],
[]
)

Test 3
=====
This is to show that UNION is a multiset UNION and two empty graph
patterns gives two extra results (two ì0).

Data:
:a :b :c .
:x :y :z

Query:
SELECT * WHERE { { ?s ?p ?o } UNION {} UNION {} }

Results:
( [ ?s = :a, ?p = :b, ?o = :c ],
[ ?s = :x, ?p = :y, ?o = :z],
[],
[]
)

Test 4
=====
This is to show that compatibility in SPARQL is universal
quantification (12.3 "Compatible Mappings") and that two disjoint
domains results in a cross product.

Data:
:a :b :c .
:x :y :z

Query:
SELECT * WHERE { { ?s ?p ?o } . { ?a ?b ?c } }

Results:
( [ ?s = :a, ?p = :b, ?o = :c, ?a = :a, ?b = :b, ?c = :c ],
[ ?s = :a, ?p = :b, ?o = :c, ?a = :x, ?b = :y, ?c = :z ],
[ ?s = :x, ?p = :y, ?o = :z, ?a = :a, ?b = :b, ?c = :c],
[ ?s = :x, ?p = :y, ?o = :z, ?a = :x, ?b = :y, ?c = :z]
)

Test 5
=====
Negative syntax test.

SELECT ?x WHERE { ?s ?p ?o }
```
Received on Tuesday, 25 March 2008 18:00:36 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:52:09 UTC