Hi Mikael, in the actual use case, we use a UNION inside the OPTIONAL:
SELECT ?employee ?reportsToEmployee ?reportsToEmployeeLabel WHERE { GRAPH ?docGraph { ?doc sioc:has_container <https://localhost:4443/employees/>; foaf:primaryTopic ?employee. OPTIONAL { ?employee schema:sponsor ?reportsToEmployee. } } OPTIONAL { { ?reportsToEmployee <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } UNION { GRAPH ?reportsToEmployeeLabelGraph { ?reportsToEmployee <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } } } } ORDER BY ?doc which would not be equivalent to SELECT ?employee ?reportsToEmployee ?reportsToEmployeeLabel WHERE { GRAPH ?docGraph { ?doc sioc:has_container <https://localhost:4443/employees/>; foaf:primaryTopic ?employee. OPTIONAL { ?employee schema:sponsor ?reportsToEmployee. } OPTIONAL { { ?reportsToEmployee <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } UNION { GRAPH ?reportsToEmployeeLabelGraph { ?reportsToEmployee <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } } } } } ORDER BY ?doc And before using a workaround, I'd like to understand first which of the implementations is correct. On Tue, Nov 24, 2020 at 2:57 PM Mikael Pesonen <mikael.peso...@lingsoft.fi> wrote: > > > Hi Martynas, > > I don't recall if nested graphs are allowed, but if so, this could work > better > > SELECT ?employee ?reportsToEmployee ?reportsToEmployeeLabel WHERE { > GRAPH ?docGraph { > ?doc sioc:has_container<https://localhost:4443/employees/>; > foaf:primaryTopic ?employee. > OPTIONAL { ?employee schema:sponsor ?reportsToEmployee. > OPTIONAL { > GRAPH ?reportsToEmployeeLabelGraph { ?reportsToEmployee > <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } > } > } > } > > } > ORDER BY ?doc > > > So second OPTIONAL inside the first one. That makes sure second OPTIONAL > isn't left unbinded. > > > > > On 24/11/2020 15.27, Martynas Jusevičius wrote: > > Hi, > > > > despite using SPARQL for years, cases where different implementations > > return different results leave me scratching my head. Can someone help > > me out with this? > > > > I have a rather simple query: > > > > PREFIX schema: <https://schema.org/> > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > > PREFIX sioc: <http://rdfs.org/sioc/ns#> > > > > SELECT * WHERE { > > GRAPH ?docGraph { > > ?doc sioc:has_container <https://localhost:4443/employees/>; > > foaf:primaryTopic ?employee. > > OPTIONAL { ?employee schema:sponsor ?reportsToEmployee. } > > } > > } > > ORDER BY ?doc > > > > Dydra returns 9 results: > > > > employee,reportsToEmployee > > https://localhost:4443/employees/1/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/2/#this, > > https://localhost:4443/employees/3/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/4/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/5/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/6/#this,https://localhost:4443/employees/5/#this > > https://localhost:4443/employees/7/#this,https://localhost:4443/employees/5/#this > > https://localhost:4443/employees/8/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/9/#this,https://localhost:4443/employees/5/#this > > > > Fuseki 3.16.0 returns 9 results: > > > > employee,reportsToEmployee > > https://localhost:4443/employees/1/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/2/#this, > > https://localhost:4443/employees/3/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/4/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/5/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/6/#this,https://localhost:4443/employees/5/#this > > https://localhost:4443/employees/7/#this,https://localhost:4443/employees/5/#this > > https://localhost:4443/employees/8/#this,https://localhost:4443/employees/2/#this > > https://localhost:4443/employees/9/#this,https://localhost:4443/employees/5/#this > > > > So far so good -- the results are identical. Now I append an OPTIONAL > > to the end of the query: > > > > PREFIX schema: <https://schema.org/> > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > > PREFIX sioc: <http://rdfs.org/sioc/ns#> > > > > SELECT ?employee ?reportsToEmployee ?reportsToEmployeeLabel WHERE { > > GRAPH ?docGraph { > > ?doc sioc:has_container <https://localhost:4443/employees/>; > > foaf:primaryTopic ?employee. > > OPTIONAL { ?employee schema:sponsor ?reportsToEmployee. } > > } > > OPTIONAL { > > GRAPH ?reportsToEmployeeLabelGraph { ?reportsToEmployee > > <http://purl.org/dc/terms/title> ?reportsToEmployeeLabel. } > > } > > } > > ORDER BY ?doc > > > > Dydra returns 9 results: > > > > employee,reportsToEmployee,reportsToEmployeeLabel > > https://localhost:4443/employees/1/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/2/#this,, > > https://localhost:4443/employees/3/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/4/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/5/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/6/#this,https://localhost:4443/employees/5/#this,Buchanan > > https://localhost:4443/employees/7/#this,https://localhost:4443/employees/5/#this,Buchanan > > https://localhost:4443/employees/8/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/9/#this,https://localhost:4443/employees/5/#this,Buchanan > > > > Fuseki 3.16.0 returns 2400+ results: > > > > employee,reportsToEmployee,reportsToEmployeeLabel > > https://localhost:4443/employees/1/#this,https://localhost:4443/employees/2/#this,Fuller > > https://localhost:4443/employees/2/#this,https://localhost:4443/,Root > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/,Categories > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/1/,Beverages > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/1/#this,Beverages > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/2/,Condiments > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/2/#this,Condiments > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/3/,Confections > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/3/#this,Confections > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/4/,Dairy > > Products > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/4/#this,Dairy > > Products > > https://localhost:4443/employees/2/#this,https://localhost:4443/categories/5/,Grains/Cereals > > .... > > > > Dydra's result is the one I'm going after, and is based on my > > understanding of OPTIONAL. But is it actually correct? > > > > And if Dydra is correct, what is Fuseki doing here? I would have > > expected the ?reportsToEmployee bindings from the appended OPTIONAL to > > be joined against the first result (without OPTIONAL), but that is not > > the case? > > > > Thanks. > > > > Martynas > > -- > Lingsoft - 30 years of Leading Language Management > > www.lingsoft.fi > > Speech Applications - Language Management - Translation - Reader's and > Writer's Tools - Text Tools - E-books and M-books > > Mikael Pesonen > System Engineer > > e-mail: mikael.peso...@lingsoft.fi > Tel. +358 2 279 3300 > > Time zone: GMT+2 > > Helsinki Office > Eteläranta 10 > FI-00130 Helsinki > FINLAND > > Turku Office > Kauppiaskatu 5 A > FI-20100 Turku > FINLAND >