- From: Holger Knublauch <yahoo@knublauch.com>
- Date: Mon, 26 Oct 2009 16:56:08 -0700
- To: public-rdf-dawg-comments@w3.org
- Message-Id: <7023A22C-70F8-44FB-A005-2FDE5113CF5C@knublauch.com>
Thanks, Lee. I appreciate you taking the time to assemble all this information. I have made some experiments with the proposal to use sub-selects plus project expressions in a random sample of some of my typical queries. You can see three cases below. Without understanding all implications from a SPARQL engine and algebra point of view, my impression is that the mapping appears to be straight forward, but that it leads to very verbose code. And I did not even try to find the really bad cases. I am therefore wondering whether LET can be introduced as syntactic sugar similar to some of the new OWL 2 extensions that do not change the semantics but only provide additional mappings from syntax to semantics - this is hopefully easier to manage for the WG? Thanks, Holger ---- From the currency conversion example on my blog http://composing-the-semantic-web.blogspot.com/2009/09/currency-conversion-with-units-ontology.html The original current query is SELECT ?newLiteral WHERE { LET (?fromCurrency := datatype(?arg1)) . LET (?rate := currencies:getRateByCurrencies(?fromCurrency, ? arg2)) . LET (?fromValue := xsd:double(?arg1)) . LET (?newValue := (?fromValue * ?rate)) . LET (?newLiteral := smf:cast(?newValue, ?arg2)) . } Using nested queries with well-meaning formatting would create something like SELECT ?newLiteral WHERE { { SELECT (datatype(?arg1) AS ?fromCurrency) (xsd:double(?arg1) AS ? fromValue) WHERE {} } { SELECT (currencies:getRateByCurrencies(?fromCurrency, ?arg2) AS ?rate) WHERE {} } { SELECT ((?fromValue * ?rate) AS ?newValue) WHERE {} } { SELECT (smf:cast(?newValue, ?arg2) AS ?newLiteral) WHERE {} } } Using a single expression would be SELECT (smf:cast((xsd:double(?arg1) * currencies:getRateByCurrencies (datatype(?arg1), ?arg2)), ?arg2) AS ?newLiteral) WHERE { } The example is a bit atypical because it exclusively uses LETs, and not even a triple match. It also uses externally pre-bound variables. But still it gives some insights. --- In the following function body, project expressions work actually ok, but keep fingers crossed that you do not have to return multiple of such computed values in the SELECT: SELECT ?value WHERE { ?arg2 qud:conversionMultiplier ?M1 . ?arg2 qud:conversionOffset ?O1 . ?arg3 qud:conversionMultiplier ?M2 . ?arg3 qud:conversionOffset ?O2 . LET (?value := ((((?arg1 * ?M1) + ?O1) - ?O2) / ?M2)) . } would become SELECT (((((?arg1 * ?M1) + ?O1) - ?O2) / ?M2) AS ?value) WHERE { ?arg2 qud:conversionMultiplier ?M1 . ?arg2 qud:conversionOffset ?O1 . ?arg3 qud:conversionMultiplier ?M2 . ?arg3 qud:conversionOffset ?O2 . } --- Here is an example from the SPIN box computer game, using LET in SPARQL rules. This is a very typical use case actually: # Rule1: Collect and replace diamond if possible CONSTRUCT { ?diamond spinbox:replaceWith spinbox:Space . ?world boulders:diamondsCollected ?newDiamondsCount . } WHERE { ?world spinbox:field ?this . ?world spinbox:keyDirection ?direction . LET (?diamond := spinbox:getNeighbor(?this, ?direction)) . ?diamond a boulders:Diamond . ?world spinbox:field ?this . ?world boulders:diamondsCollected ?oldDiamondsCount . LET (?newDiamondsCount := (?oldDiamondsCount + 1)) . } This would become # Rule1: Collect and replace diamond if possible CONSTRUCT { ?diamond spinbox:replaceWith spinbox:Space . ?world boulders:diamondsCollected ?newDiamondsCount . } WHERE { ?world spinbox:field ?this . ?world spinbox:keyDirection ?direction . { SELECT (spinbox:getNeighbor(?this, ?direction) AS ?diamond) WHERE { } } ?diamond a boulders:Diamond . ?world spinbox:field ?this . ?world boulders:diamondsCollected ?oldDiamondsCount . { SELECT ((?oldDiamondsCount + 1) AS ?newDiamondsCount) WHERE { } } } On Oct 25, 2009, at 8:34 PM, Lee Feigenbaum wrote: > Hi Holger, > > Thanks for the feedback. Unfortunately, assignment is not on the > current Working Group's road map for standardization at this time. > Here's how we got to this point: > > From roughly March through May, the WG considered around 40 > potential new features[1] for the SPARQL landscape, including > assignment[2]. At the time, we documented two implementations (ARQ > and Open Anzo) and the support that you expressed for the feature > back in March[3]. > > In going through the features, the WG discussed Assignment in our > March, 31 teleconference. You can see the discussion at the time at > [4], the results of which was a straw poll result of 7/6/3, > indicating some support and several notes of concern. > > Later in the process, we took a survey of WG member's prioritized > preferences of the proposed features. Steve Harris whipped up the > Condorcet results of the survey which you can see at [5]. Assignment > was in the middle of the pack. > > At the group's first face-to-face meeting in May, assignment was > discussed once more[6], with significant concerns expressed from > Garlik and OpenLink Software, strong support from Clark & Parsia, > and expressions ranging from indifference to mild support from other > WG members (as I read the minutes & recollect the conversation). In > the end, the group resolved to accept the list of feature proposals > at [7], and Kendall's concerns about the relationship between > assignment and projected expressions was addressed by Steve H at [8]. > > Since then, the group has been rechartered with a specific mandate > to work on the features decided during the first phase of the > group's lifetime[9]. It's my hope & belief that if projected > expressions do not end up fulfilling most users' needs, that > implementors will extend their SPARQL implementations with > assignment or a similar capability, and we will then revisit this in > the next round of SPARQL standardization. > > hope this is helpful, > Lee > > > [1] http://www.w3.org/2009/sparql/wiki/Category:Features > [2] http://www.w3.org/2009/sparql/wiki/Feature:Assignment > [3] http://lists.w3.org/Archives/Public/public-rdf-dawg-comments/2009Mar/0009.html > [4] http://www.w3.org/2009/sparql/meeting/2009-03-31#assignment > [5] http://plugin.org.uk/misc/votes2.svg > [6] http://www.w3.org/2009/sparql/meeting/2009-05-06 > [7] http://www.w3.org/2009/sparql/wiki/index.php?title=FeatureProposal&oldid=744 > [8] http://lists.w3.org/Archives/Public/public-rdf-dawg/2009AprJun/0231.html > [9] http://www.w3.org/2009/05/sparql-phase-II-charter > > Holger Knublauch wrote: >> Dear WG, >> reading through the drafts (great to have them already!) I am >> confused about the future of Assignments (LET keyword in Jena) >> which has proven to be absolutely essential for many of our >> customers projects. The SPARQL 1.1 working group seems to have >> converged in favor of supporting Project expressions and subqueries >> only, but these IMHO fail to address the requirements below. >> Problem 1: How to create new values for CONSTRUCT queries >> Project expressions solve some problems for SELECT queries, but the >> major use cases of LET have been in CONSTRUCT queries. I only see >> subqueries as a (poor) way of creating new values for use in the >> CONSTRUCT clause. Creating a subquery for every LET looks like a >> very user unfriendly mechanism to me. >> Problem 2: Verbosity >> We often work with complex transformations such as string >> operations that are best split into multiple steps. Project >> expressions do not allow using intermediate variables, such as >> below and would force users to chain together very long spaghetti >> expressions such as SELECT (?x ex:function3(ex:function2 >> (ex:function1(?y))). Imagine this with some more complex >> expressions and it quickly becomes completely unreadable. Also, >> consider you would want to reuse intermediate values in multiple >> places, to avoid duplicate processing. >> *SELECT* ?x ?r >> *WHERE* { >> ?x ex:property ?y . >> *LET* (?helper1 := ex:function1(?y)) . >> *LET* (?helper2 := ex:function2(?helper1)) . >> *LET* (?r := ex:function3(?helper2)) . >> } >> The LET keyword has solved both problems nicely and in the most >> general way, and would make project expressions superfluous. >> I would appreciate pointers to the discussions that led to the >> decision to not support Assignments at this stage. >> Thanks >> Holger >> PS: For a parallel thread on jena-dev (with Andy's response), see >> http://tech.groups.yahoo.com/group/jena-dev/message/41903
Received on Monday, 26 October 2009 23:56:48 UTC