[
https://issues.apache.org/jira/browse/JENA-1526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16440055#comment-16440055
]
Andy Seaborne commented on JENA-1526:
-------------------------------------
Try this simplification of the issue: the UNION is there to put in both cases:
{noformat}
SELECT * {
{
VALUES ?X { 1 }
OPTIONAL { VALUES ?X { 2 } }
}
UNION
{
OPTIONAL { VALUES ?Y { 2 } }
VALUES ?Y { 1 }
}
}
{noformat}
Part 1:
{noformat}
(leftjoin
(table (vars ?X) (row [?X 1]))
(table (vars ?X) (row [?X 2]))
{noformat}
and part 2:
{noformat}
(join
(leftjoin
(table unit) ## << because there was nothing written before the
OPTIONAL
(table (vars ?Y) (row [?Y 2]))
)
(table (vars ?Y) (row [?Y 1]))
))
{noformat}
> OPTIONAL clause filters out results when defined before inner SELECT
> --------------------------------------------------------------------
>
> Key: JENA-1526
> URL: https://issues.apache.org/jira/browse/JENA-1526
> Project: Apache Jena
> Issue Type: Question
> Environment: apache-jena-fuseki-3.7.0
> Reporter: Kevin Smyth
> Priority: Major
>
> Given this dataset
> {code:java}
> @prefix ns1: <http://example.com/ns1#> .
> @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
> <ns1://Example#R1>
> a ns1:type_ ;
> ns1:sb <http://example.com/#Mass_29> .
> <http://example.com/#Mass_29>
> ns1:satisfies <ns1://Example#R1> ;
> ns1:run_id ns1:29 .
> ns1:29 a ns1:run ;
> ns1:time "2018-04-12T19:43:14.702"^^xsd:dateTime .
> ns1:799fdfc a ns1:run ;
> ns1:time "2018-04-13T16:55:47-05:00"^^xsd:dateTime .
> {code}
> This query:
> {code:java}
> PREFIX ns1: <http://example.com/ns1#>
> SELECT ?s ?run ?id
> WHERE {
> ?s a ns1:type_ .
> {
> SELECT ?id
> WHERE {
> values ?id { ns1:799fdfc }
> } LIMIT 1
> }
> OPTIONAL {
> ?s ns1:sb ?run .
> ?run ns1:run_id ?id .
> }
> }
> {code}
> produces 1 result, whereas switching the inner SELECT and OPTIONAL:
> {code:java}
> PREFIX ns1: <http://example.com/ns1#>
> SELECT ?s ?run ?id
> WHERE {
> ?s a ns1:type_ .
> OPTIONAL { ?s ns1:sb ?run .
> ?run ns1:run_id ?id . }
> {
> SELECT ?id
> WHERE {
> values ?id { ns1:799fdfc }
> } LIMIT 1
> }
> }{code}
>
> produces no results.
>
> The spec specifies "In an optional match, either the optional graph pattern
> matches a graph, thereby defining and adding bindings to one or more
> solutions, or it leaves a solution unchanged without adding any additional
> bindings." and "Due to the bottom-up nature of SPARQL query evaluation, the
> subqueries are evaluated logically first, and the results are projected up to
> the outer query.", so I don't see how this is the correct behavior.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)