From: Max - M. <ma...@mi...> - 2015-05-28 15:01:57
|
Ok forget this, I just realized I was running the test-case against my Sesame Store instead of the InMemory (which effectively handles the join example correctly). I'll file them a bug request. Sorry for the time wasted and thanks for your patience. However for the BIND LHS with left join, the variables I use in the expression are also bound from a triplePattern. Here is an example ex:cmd ex:hasDefaultGraph ?g . BIND(IRI(CONCAT("tmp:, STR(?g))) AS ?tmpG) OPTIONAL { GRAPH ?tmpG { ... Could it be safe to say that the BIND variable is floating if any of the expression variables is floating and otherwise make it fixed ? And modify the CanFlowResultsToRhs l.312 into if (rhsFloating.Any(v => lhsFloating.Contains(v) /* || lhsFixed.Contains(v) */ )) return false; This seems to do the trick in my case. Max. 2015-05-28 15:32 GMT+02:00 Rob Vesse <rv...@do...>: > Comments inline > > > From: Max - Micrologiciel <ma...@mi...> > Date: Thursday, 28 May 2015 13:36 > To: Rob Vesse <rv...@do...> > Cc: dotNetRDF Developer Discussion and Feature Request < > dot...@li...> > Subject: Re: About PR#36 > > Sorry but I missed the conclusion of the demonstration : > > This to show that after a variable is defined by a BIND statement it > should not be considered as a floating variable. > > > However your conclusion about floating variables and BIND is wrong at > least according to how we define and use the concept of a floating variable > within the Leviathan engine > > A floating variable is a variable whose value is not guaranteed to be > bound which as I pointed out is the exact definition of a BIND variable, > the expression could error and so the variable could be unbound > > > > To my understanding, the only floating variables to be considered should > come from VALUES clauses. > > > Floating variables can come from BIND, OPTIONAL, VALUES, SELECT > expressions, aggregates I.e. anywhere where an expression is evaluated or > where it is possible to have unbound values > > > Max. > > 2015-05-28 14:31 GMT+02:00 Max - Micrologiciel <ma...@mi...>: > >> Rob, >> >> thanks for the answers. >> >> Concerning the extend case, I then definitely believe there is a flaw in >> our evaluation logic. >> *To me, the join operation should behave as it would in relational logic >> meaning comparing NULL with NULL will always return false so no result.* >> > > It already does, you seem to be conflating joins with left joins > (OPTIONAL) and the two are not the same > > >> Here's my demonstration of the case. >> >> First about the join evaluation, based on the recommendation we get : >> >> 1. §18.5 : Join(Ω1, Ω2) = { merge(μ1, μ2) | μ1 in Ω1and μ2 in Ω2, and >> μ1 and μ2 are compatible } >> 2. $18.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) >> Here, μ1(v) = μ2(v) means that μ1(v) and μ2(v) are the same RDF term. >> >> Inferred from this the join definition would be equivalent to Join(Ω1, Ω2) >> = { merge(μ1, μ2) | μ1 in Ω1and μ2 in Ω2, and for each variable v in >> intersect(dom(μ1) dom(μ2)) sameterm(μ1(v), μ2(v)) is true } >> which means the join >> >> ?s ?p1 ?o1 . >> ?s ?p2 ?o2 >> >> is equivalent to >> >> ?s1 ?p1 ?o1 . >> ?s2 ?p2 ?o2 >> FILTER (sameterm(s1,s2) >> >> But we also have : >> >> 1. $17 Specifically, FILTERs eliminate any solutions that, when >> substituted into the expression, either result in an effective boolean >> value of false or produce an error. >> 2. §17.2 sameterm will produce a type error if any arguments are >> unbound >> >> >> Then about the extend case, let's say we have this graph pattern: >> >> ?s ?p ?o . FILTER(isLiteral(?o)) >> ?s2 ?p2 ?o2 . >> >> The evaluation will return a cross join of both triple pattern mutlisets >> since according to $18.3, they are compatible because having no common >> variable. >> >> On the other hand, given the following pattern, >> >> {?s ?p ?o . FILTER(isBlank(?o)) } >> BIND (iri(?o) as ?s2) . >> ?s2 ?p2 ?o2 >> >> Under your logic, the join would return me the same results since iri(?o) >> will produce a type error ?o being a blank node which is not accepted by >> the Iri function. >> > > Nowhere did I say this > > With regards to index joins we were talking specifically about the case of > a BIND being on the LHS of an OPTIONAL which is completely different > because left joins are not commutative > > Rob > > >> >> I do not agree with this since : >> >> 1. §10.1 Use of BIND ends the preceding basic graph pattern. >> 2. If the evaluation of the expression produces an error, the >> variable remains unbound for that solution but the query evaluation >> continues. >> >> Which means to me that in fact we now have to perform a join between the >> two mutlisets μ1[?s ?p ?o ?s2] and μ2[?s2 ?p2 ?o2] >> >> >> So still according to §18.5 and §18.3, both multisets are then now >> incompatible since they share the ?s2 variable which can not be compared >> under the sameterm conditions. >> >> Thus We should get no result back from the query. >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> 2015-05-28 12:50 GMT+02:00 Rob Vesse <rv...@do...>: >> >>> Max >>> >>> Comments inline: >>> >>> From: Max - Micrologiciel <ma...@mi...> >>> Date: Wednesday, 27 May 2015 13:48 >>> To: Rob Vesse <rv...@do...> >>> Subject: About PR#36 >>> >>> Hi Rob, >>> >>> just been reviewing some comment you made in the #36 PR >>> <https://bitbucket.org/dotnetrdf/dotnetrdf/pull-request/36/new-spin-library> about >>> a change I made at first with the order of join arguments between the >>> query's algebra and any possible BindingPattern. >>> >>> You wrote : >>> "Though I think our handling of VALUES may already be broken in some >>> cases anyway e.g. interaction with GROUP BY" >>> >>> Would you have some example that exposes the problem, so I can have a >>> look into it ? >>> >>> >>> If memory serves the problem is that we apply VALUES too soon. It >>> should apply after any GROUP BY, HAVING and SELECT expressions but we apply >>> it before those. This is a fairly trivial fix which I simply haven't got >>> round to because it is a rare enough case that nobody has ever complained >>> that it is broken (NB - It's fixed in the new Medusa engine on the 1.9 >>> branch) >>> >>> >>> >>> On the other hand, I do not agree with you when you say that inverting >>> the join parameters would break our compliance with the spec : since the >>> join operation is normally commutative (and neither does the recommendation >>> specifies explicitly in which order the sets are to be joined), we should >>> be able to join the arguments in both orders and get the same results . >>> >>> >>> In principal yes, however once you start doing indexed joins this does >>> have the potential to break things if you aren't careful though we are >>> fairly careful these days so probably doesn't make a difference nowadays >>> >>> Moreover, evaluating the bindings first could also lead to better >>> performances since bound variables injection into the RHS whenever possible >>> would lighten the multiset to join with. >>> >>> There is also an issue I encountered and I'd like to discuss with the >>> Extend algebra. >>> When used as a left join LHS, it prevents injecting the bound variables >>> into the Rhs due to the CanFlowResultsToRhs workings and how the extended >>> variable is always treated as floating. >>> >>> >>> Well anything introduced by Extend always has to be treated as floating >>> because the expression could produce an error or an unbound value >>> >>> There are a couple of cases when the expression is a constant value or a >>> copy of a variable (provided we know that variable to be fixed) that we >>> could special case but otherwise we can't do anything more. >>> >>> If you are generating Extends simply to introduce constants generating >>> Values instead may be a better approach and will benefit from index joins >>> as you note. >>> >>> Rob >>> >>> >>> Perhaps it would be better to discuss these live, if you're available ? >>> >>> Cheers, >>> Max. >>> >>> >>> >>> >>> >>> >> > > > ------------------------------------------------------------------------------ > > _______________________________________________ > dotNetRDF-develop mailing list > dot...@li... > https://lists.sourceforge.net/lists/listinfo/dotnetrdf-develop > > |