00:19:47 LeeF has joined #sparql 00:33:09 AndyS has joined #sparql 00:45:07 SteveH has joined #sparql 00:52:24 Zakim has left #sparql 05:01:22 AxelPolleres has joined #sparql 05:13:29 AxelPolleres has left #sparql 12:01:44 RRSAgent has joined #sparql 12:01:44 logging to http://www.w3.org/2010/03/26-sparql-irc 12:01:46 RRSAgent, make logs world 12:01:46 Zakim has joined #sparql 12:01:48 Zakim, this will be 77277 12:01:48 ok, trackbot; I see SW_(SPARQLF2F)8:00AM scheduled to start now 12:01:49 Meeting: SPARQL Working Group Teleconference 12:01:49 Date: 26 March 2010 12:01:49 zakim, this will be SPARQL 12:01:49 ok, LeeF; I see SW_(SPARQLF2F)8:00AM scheduled to start now 12:03:32 Souri has joined #sparql 12:07:38 topic: SPARQL 1.1 Query 12:07:43 subtopic: Aggregates 12:08:02 dcharbon2 has joined #sparql 12:08:12 scribenick: kasei 12:08:13 http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JanMar/0499.html 12:08:38 AxelPolleres: multiset proposal from AndyS 12:08:50 ... examples in email. 12:08:52 MattPerry has joined #sparql 12:09:25 SteveH: scribenick: LeeF 12:09:28 oops 12:09:28 scribenick: LeeF 12:10:02 SteveH: there are some things in the mail that needs discussion 12:10:37 ...ignroe mail because it's out of line with the current spec 12:10:44 ...currently: aggregates take a list of expressions 12:10:48 ...evaluated with respect to the binding table 12:12:44 pgearon has joined #sparql 12:13:36 ...end up with an NxM list of values 12:13:41 ...gets passed to the aggregate value 12:13:46 ...which returns scalar results 12:14:00 ...doesn't usefully let you deal with multi-argument aggregates 12:14:10 ...Andy's proposal is that instead of producing a big multiset 12:14:17 ...you'd have a multiset of lists 12:14:30 ...where each list is the evaluation of the expressions in the aggregate with respect to the binding table 12:16:02 ?x = 1,2 ?y = 3, 4 12:16:02 and AGG(?x, ?y) 12:16:02 gives AGG({(1, 3), (2, 4)}) 12:17:07 LeeF: what's the alternative? 12:17:12 {1, 3, 2, 4} 12:17:35 LeeF: definitely prefer Andy's proposal 12:17:43 SteveH: me too 12:17:45 AndyS: works well for geospatial examples 12:18:12 SteveH: complicates the definition of the set functions a bit 12:18:22 Axel: Seems to be consensus aorund this 12:19:34 AxelPolleres: referring to ISSUE-3, how are errors and unbounds handled? 12:19:44 AxelPolleres: we need to decide per aggregate, right? 12:19:47 SteveH: not necessarily 12:20:14 AxelPolleres: should we go through the list of aggregates? 12:20:25 SteveH: I think it depends on what we decide happens with error values 12:20:38 ...I like Andy's proposal for minting a unique symbol, but don't like passing them into the aggregate 12:20:45 ...would rather pass a flag or a count of evaluation errors 12:21:01 Builin aggregates in grammar currently: http://www.w3.org/2009/sparql/docs/sparql-grammar-11.html#rAggregate (any missing?) 12:21:42 evaluation of unbound leaves an error, so hard/impossible to distinguish. 12:22:31 ?x = 1, e ?y = 3, 4 12:22:31 and AGG(?x, ?y) 12:22:31 gives AGG({(1, e), (2, 4)}) 12:22:31 or AGG({(2, 4)}) + 1 error 12:23:03 SteveH: pretend e is something that evaluates to an error 12:23:16 ...choices are a list with the error value in it, or else a list of the OK ones + an indication of the error 12:23:28 ...or (e, e) as a value passed to the aggregate 12:23:33 or (e,e), (2,4) 12:24:37 SteveH: this would mean that the aggregate would take a multiset of lists and a count of errors 12:24:54 bglimm: example should really be (1, 3) and (e, 4) 12:25:00 Correction: AGG({(1, 3), (e, 4)}) 12:25:02 AxelPolleres: why is the number of errors important? 12:25:20 AndyS: tells you the difference between the number of items in the partition and [too quiet for scribe to hear] 12:25:39 ...lets you do COUNT(*) like things 12:26:05 AxelPolleres: is this helpful for extending aggregates? 12:26:06 AndyS: yes 12:26:17 AxelPolleres: multiset with errors in place conveys more information 12:26:40 ...if you throw that information away, then in the algebra you've already made a decision for someone else who wants to define a custom aggregate on which information you have access to 12:26:48 SteveH: yes 12:26:55 AndyS: yes, but gives you uniform treatment of errors 12:27:36 AxelPolleres: but what if someone wants to define an aggregate where you want to act differently depending on if an error occurs in the first or second argument? 12:27:44 SteveH: idea is to make all aggs behave in the same way 12:27:51 ...can alter behavior with, e.g., COALESCE 12:28:34 q+ to ask if Axel has a use case for needing the other behavior 12:28:46 AxelPolleres: would suggest different aggregates for different behavior 12:28:47 ack me 12:28:47 LeeF, you wanted to ask if Axel has a use case for needing the other behavior 12:29:33 LeeF: asks if Axel has a use case for the other behavior 12:29:35 AxelPolleres: No 12:29:45 LeeF: happy with the design that passes errors separately from the multiset of lists 12:31:28 AxelPolleres: is everyone happy with the solution? you have a multiset of lists with no errors, and the number of rows where an error occurred 12:31:53 Souri: do you have a concrete example? 12:32:21 COUNT ( ?X ?Y ) 12:32:21 ... perhaps COUNT with 2 columns 12:32:44 MattPerry: how does this effect the results of aggregates? 12:33:15 LeeF: my guess is it doesn't affect the semantics of the built-in aggregates, rather it affects whta's available to extension aggregates 12:33:46 s/ISSUE-3/ISSUE-53 12:33:50 (way back up high) 12:34:01 ?a ?b 12:34:01 1 2 12:34:01 3 A 12:34:01 COUNT(xsd:integer(?a), xsd:integer(?b)) 12:34:02 COUNT({(1, 2)}, errors = 1 12:34:25 answer: 2 12:34:41 IvanH: why would the answer be 2? 12:34:45 SteveH: the answer would be 1 12:34:59 s/SteveH: the answer would be 1/SteveH: because there are 2 elements 12:35:04 COUNT ( * ) here would be 2, yes? 12:35:08 AndyS: I would expect the answer to be 1 12:35:16 bglimm: 1 results + 1 error row = 2 results 12:35:22 We haven't completely decided if we allow multiple args to COUNT - a discussion for the specifics of COUNT later 12:35:24 SteveH: COUNT(*) is a completely special case 12:35:45 In SQL, it seems agg(any error) is error. agg of nulls is skipped. 12:35:47 count(*) = 2, count(?x, ?y) = 1, right? 12:35:49 SteveH: I would expect COUNT on multiple values to count the # of values, not the number of rows 12:36:14 COUNT(COALESCE(?x,?y)) 12:36:19 LeeF: I implement COUNT on multiple values to be the number of rows with at least one bound value 12:36:23 would a row (e,e) be counted? 12:36:34 AndyS, yes, that's basically what I do :) 12:37:20 That is how to get the other effect of count when one or more is defined/non-error 12:39:00 COUNT({(1, 2)} 12:39:14 and the error count? 12:39:16 + errors = 1 12:39:43 ?a ?b 12:39:43 1 2 12:39:44 3 A 12:39:44 B C 12:40:27 q+ to ask about relation to what happens to errors in solution set 12:40:34 SteveH: counting tuples seems to be what people expect 12:40:36 COUNT() will count the number of tuples 12:40:45 AxelPolleres: COUNT only counts tuples without errors 12:40:54 AxelPolleres: special case is COUNT(*) which counts ... 12:40:57 COUNT(*) is special 12:41:03 SteveH: it's defined as counting the number of rows in the solution set 12:41:08 q? 12:41:12 ack me 12:41:12 LeeF, you wanted to ask about relation to what happens to errors in solution set 12:42:09 SELECT (1/0 AS ?X) --> get one row with no binding for ?X 12:42:38 LeeF: given that behavior, I would expect COUNT({(1, 2)}, errors = 1 to give a COUNT of 2 12:43:56 we can define SELECT (1/0 AS ?X) differently - it's an independent decision - can go either way 12:44:58 ?a ?b 12:44:58 1 2 12:44:58 3 A 12:44:59 Do I get that right? 12:44:59 ?a ?b 12:45:00 1 2 12:45:00 3 A 12:45:00 B C 12:45:00 COUNT_Steve(?a ?b) -> 3 12:45:02 COUNT_Lee(?a ?b) -> 2 12:45:04 COUNT_Andy(?a ?b) -> 1 12:45:24 q+ to work through my opinion over Axel's case 12:45:48 should be COUNT(xsd:integer(?a), xsd:integer(?b)) 12:45:49 q+ 12:46:05 SELECT (xsd:integer(?a) AS ?a_int) (xsd:integer(?b) AS ?b_int) 12:46:35 count(*) = 2, count(?x, ?y) = 1, right? 12:46:43 SELECT (COUNT(xsd:integer(?a), xsd:integer(?b)) ?count) 12:47:08 LeeF: would expect to COUNT to give me the number of rows from the former case that have at least one OK value 12:47:09 MattPerry has joined #sparql 12:47:17 s/to COUNT/COUNT 12:47:33 ack AndyS 12:47:36 ack me 12:47:36 LeeF, you wanted to work through my opinion over Axel's case 12:47:44 q? 12:47:45 AndyS: we can decide either way what an error in the select expression does 12:47:51 ... i thought the preference was to keep it unbound 12:48:01 ... so SELECT is not acting like a FILTER 12:48:16 q+ ta ask on what's the status of errors in SELECT expressions 12:48:32 q+ to ask on what's the status of errors in SELECT expressions 12:48:32 q+ 12:48:38 AndyS: I don't see the need to align the two behaviors 12:49:11 ack SteveH 12:49:26 SteveH: I would expect COUNT to be more similar to FILTER with which you lose a row with an error 12:49:57 ??example; SELECT ... HAVING COUNT(xsd:integer(?a), xsd:integer(?b)) > 0 12:50:08 Souri has joined #sparql 12:50:32 LeeF: I would want COUNT in Axel's example to be 2 because in the non-aggregate case you would have 2 rows that have at least one binding 12:50:43 ... (you have a 3rd row with no bindings) 12:51:29 LeeF, you can get it withj COUNT(COALESCE(int(?x),int(?y)) -- all answers are COALESCE 12:51:47 AndyS, yes, I can, it's not what my impl (or intuition) does though :) 12:52:07 q? 12:52:09 ack AxelPolleres 12:52:10 AxelPolleres, you wanted to ask on what's the status of errors in SELECT expressions 12:52:11 ack Axel 12:52:54 For me, the semantics of COUNT involve COUNTing rows that have _something_ in it 12:53:00 s/For me/LeeF: For me/ 12:53:05 Souri: that is like in SQL 12:53:36 ... it's like doing a COUNT(*) limited to the sliced multiset 12:53:50 ... if you do COUNT(X) in SQL and X has a null value, it's not counted 12:53:54 We coudl define COUNT(?x) as single arg only 12:53:54 LeeF: that's where my intuition comes from 12:53:58 q+ 12:54:22 OPTION 1 : FILTER view, result = 1 12:54:23 OPTION 2 : projection view, result = 3 (always the same as COUNT(*)) 12:54:23 OPTION 3 : count rows with at least one unbound, result =2 12:54:31 q? 12:54:38 ack dcharbon 12:54:48 dcharbon2: tried to figure out what i thought the meaning of some of these results is 12:54:56 Under option 2, COUNT(?x) == COUNT(*) ?? 12:55:19 ... with OPTION 1: you're counting complete tuples - then you can use COALESCE to get the count of tuples with any content - you're still missing a way to get the COUNT of all tuples including empty ones 12:55:26 ... there are probably use cases for all 3 12:55:27 As I see it, the only difference is whether something like xsd:integer(nonInteger) inserts a null/unbound value or whether it takes the row out in which nonInteger occurred 12:55:56 I think you can think of them options as: 12:55:57 COUNT(xsd:integer(?a) + xsd:integer(?b)) 12:55:57 COUNT(COALESCE(xsd:integer(?a), xsd:integer(?b))) 12:55:57 COUNT(1) 12:56:03 not (1)... 12:56:06 that's wrong 12:56:43 dcharbon2: I like OPTION 1 because I think it gives you the flexibility to do all of the approaches 12:57:05 LeeF: that doesn't match my intuition, but I find dcharbon2's reasoning compelling 12:58:19 q+ 12:58:38 ack kasei 12:58:56 kasei: OPTION 1 does not count any row with an error anywhere in the tuple 12:59:18 LeeF: is this just errors, not unbounds? 12:59:24 SteveH: no it's the same, because eval(unbound) = error 12:59:34 LeeF: that's kind of weird to me 12:59:42 SteveH: also not happy, but would be difficult to change 13:00:14 AndyS: you could change it by special casing aggregate arguments that just take a variable 13:00:40 SELECT COUNT(xsd:integer(?x)) AS ?count with ?x/abc, ?x/efg gives ?count/0 13:00:57 LeeF: 13:00:59 PROPOSED: go for Option 1 on COUNT and allow multi-argument counts. 13:01:04 +1 13:01:20 +1 13:01:22 +1 13:01:23 +1 13:01:28 0 13:01:50 0 13:01:57 AxelPolleres: With this approach, we don't need to introduce errors into our value system 13:02:10 OPTION 1 : error anywhere in tuple -> tupe not passed down (~whole tuple an error) ==> result = 1 13:02:47 q+ 13:02:53 PROPOSED: go for Option 1 (error anywhere in tuple -> tupe not passed down (~whole tuple an error)) on COUNT and allow multi-argument counts. 13:03:14 +1 13:03:20 +1 13:03:21 +1 13:03:22 +1 13:03:27 MattPerry: does this mean that for the purpose of aggregates, unbound and error are the same thing? 13:03:30 AxelPolleres: yes 13:03:33 +1 13:03:51 RESOLVED: go for Option 1 (error anywhere in tuple -> tupe not passed down (~whole tuple an error)) on COUNT and allow multi-argument counts. 13:04:51 Souri abstaining 13:05:14 AxelPolleres: other aggregates? 13:05:36 SteveH: i think we need to agree which ones, then I can go reword the spec in terms of the discussion today, but don't think we should go through all of them today - most are obvious 13:05:59 AxelPolleres: should we go through them and discuss what happens with errors ? 13:06:08 SUM(?x,?y) = SUM(?x+?y) under this design : any error => error => no tuple regardless of cause. Nice 13:06:09 s/with errors/???/ 13:06:13 rermaining aggregates SUM, MIN, MAX, AVG, GROUP_CONCAT, and SAMPLE 13:06:46 Definition: Sum 13:06:47 The Sum aggregate function is used by the SUM function in the syntax. 13:06:47 The Mutiset argument to Sum is regarded as a sequence of values, S, and Sum is defined such that: 13:06:47 Sum(S) = op:numeric-add(S0, Sum(S1..n)) when |S| > 1 13:06:47 Sum(S) = S0 when |S| = 1 13:06:47 Sum(S) = 0 when |S| = 0 13:06:49 In this way, Sum({1, 2, 3}) = op:numeric-add(1, op:numeric-add(2, 3)). 13:07:13 q+ to suggest that we PROPOSE to resolve ISSUE-53 noting that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the count of such excluded errors is passed to the aggregate function 13:07:23 ack me 13:07:55 ack me 13:07:55 LeeF, you wanted to suggest that we PROPOSE to resolve ISSUE-53 noting that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the 13:07:56 so you can Sum over a single bnode? 13:07:59 ... count of such excluded errors is passed to the aggregate function 13:08:20 kasei, good point 13:08:24 PROPOSED: resolve ISSUE-53 noting that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the count of such excluded errors is passed to the aggregate function 13:09:14 SUM(_:haha) = _:haha 13:09:37 + 13:09:38 maybe SUM(X) is X-X+X :-) 13:09:38 +1 13:09:47 Sum(S) = op:numeric-add(S0, 0) when |S| = 1 13:09:50 PROPOSED: resolve ISSUE-53 noting that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the count of such excluded errors is passed to the aggregate function 13:09:58 SUM(x) = op:numeric-add(x, 0) 13:10:45 RESOLVED: resolve ISSUE-53 noting that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the count of such excluded errors is passed to the aggregate function, no abstentions or objections 13:11:04 close ISSUE-53 13:11:04 ISSUE-53 How are unbounds and errors treated in aggregate evaluation? closed 13:11:15 ISSUE-53: resolved that tuples with errors are excluded from the multiset of lists passed to aggregate functions, and that the count of such excluded errors is passed to the aggregate function, no abstentions or objections 13:11:15 ISSUE-53 How are unbounds and errors treated in aggregate evaluation? notes added 13:11:28 subsubtopic: SUM 13:11:48 AxelPolleres: (1) any non-numeric value in SUM is not considered 13:12:00 ... (2) do we allow multi-argument SUM? 13:12:07 SteveH: my temptation is to sum over the tuple and then sum the sums 13:12:30 LeeF: that's what I do 13:13:03 q+ 13:13:04 multi-argument SUM to be defined in the straightforward way, i.e. sum arguments 13:13:19 ? 13:13:34 ack Souri 13:13:51 q+ to ask whether we need that at all 13:14:14 q+ to wonder if our resolution to ISSUE-53 makes multi-argument SUM act weird 13:14:23 SUM ( ?X ?Y ) = SUM (?X+?Y ... same amount of characters. 13:14:38 ?a ?b 13:14:38 1 2 13:14:38 3 A 13:14:38 SUM(?a, ?b) = 3 13:14:50 q+ 13:15:06 sum(?a+?b) vs sum(?a,?b) ? 13:15:15 SUM(?x,?y) is different from SUM(?x+?y) in the case of error/unbound, right? 13:15:40 dropping a pair vs. dropping a single element...? 13:16:20 do we need multi-arg sum ? 13:16:26 ignore me. LeeF caught me up, but it brings up another issue. 13:16:26 q- 13:17:07 ack Axel 13:17:07 AxelPolleres, you wanted to ask whether we need that at all 13:17:19 +1 Souri 13:17:45 happy to have SUM() syntactically limited to a single argument 13:18:03 +1 single argument SUM() only 13:18:08 SELECT (SUM(?fingerLength, ?toeLength) AS ?sum) { 13:18:08 { ?person :fingerLength ?fingerLength } 13:18:08 UNION 13:18:08 { ?person :toeLength ?toeLength} 13:18:08 } 13:18:30 LeeF: the above use case ends up passing nothing at all to SUM 13:18:37 ... because every tuple has an unbound variable 13:18:38 LeeF, I was just thinking of summing on OPTIONAL ?age. 13:18:39 ... which turns into an error 13:18:56 iv_an_ru has joined #sparql 13:19:27 SELECT (SUM(COALESCE(?fingerLength,0), COALESCE(?toeLength,0)) AS ?sum) ... 13:19:51 q? 13:19:56 ack LeeF 13:19:56 LeeF, you wanted to wonder if our resolution to ISSUE-53 makes multi-argument SUM act weird 13:21:07 q+ 13:21:52 ack AndyS 13:22:00 AndyS: you can also do it by passing the sum into the union 13:22:11 ...by using the same variable 13:22:32 +1 13:22:36 AxelPolleres: can we just keep SUM as a single argument aggregate? 13:22:55 SteveH: don't see a reason to, but won't object 13:22:56 +0 13:23:01 AxelPolleres: would anyone object to multi-argument SUM? 13:23:03 Souri: I would. 13:23:04 +0 13:23:19 AxelPolleres: Suggest based on this we keep SUM as single argument. 13:23:40 PROPOSED: keep SUM as a single argument aggregate, no SUM(*) 13:23:44 +1 13:23:47 +1 13:23:50 0 13:23:53 +1 13:23:54 0 13:23:56 abstain 13:24:01 +1 13:24:52 RESOLVED: keep SUM as a single argument aggregate, no SUM(*), 3 abstain, no objections 13:25:12 Definition: Min 13:25:13 The multiset of values passed as an argument is converted to a sequence S, this sequence is ordered as per the ORDER BY ASC clause. 13:25:13 Min(S) = S0 13:25:40 SteveH: believe this came out of difficulty coming up with something at F2F2 13:26:09 LeeF: agree this was the emerging but not overwhelming consensus at the last F2F 13:26:20 SteveH: can meet most use cases with casting and coalesce 13:27:59 so, MIN({(1, 2), (3, 4)} = MIN({1, 2, 3, 4}) 13:28:25 SteveH, are there use cases that can't be met with single-arg MIN/MAX if we have IF() ? 13:28:43 I support multi-arg, but want to understand the options. 13:30:17 MIN(?x, COALESCE(?y, ?x)) 13:30:46 LeeF: Notes that passing in tuples with error in val slot allows each aggregate to decide 13:31:26 LeeF: in particular, whereas errors failing the tuple feels somewhat natural, innocent unbound variables now also yank out other nice values along with them 13:31:28 MIN(COALESCE(?x,?y, ?z), COALESCE(?y, ?z, ?x) COALESCE(?z, ?x ?y)) 13:31:38 q+ to get clarification from SteveH 13:31:40 Souri has joined #sparql 13:32:21 MIN(min(?x, ?y)) also works when ?x and ?y are numbers 13:32:22 Sometimes MIN(?x,?y) -> fn:min(MIN(?x),MIN(?y)) and does a reasonable (not quite same) thing 13:32:29 s/min/fn:min/ 13:32:53 is fn:min a thing? 13:33:01 it is for me 13:33:02 SteveH: I believe that multiargument MIN inwhich one of the variables is sometimes unbound is a corner case 13:33:05 LeeF: Granted 13:33:06 fn:min comes from F&O 13:33:14 s/inwhich/in which/ 13:33:15 IIRC 13:33:23 right, but it's not a standard yet...? 13:33:32 +q 13:33:40 (actually it takes sequence? - rat hole) 13:34:09 AxelPolleres: (1) only allow single arugment MIN (2) reconsider resolution to ISSUE-53 13:34:15 q? 13:34:18 ack kasei 13:34:18 kasei, you wanted to get clarification from SteveH 13:34:39 kasei: re: use cases for multiargument MIN. Would an IF function address these use cases? 13:35:15 SteveH: my use cases involve not knowing the type of the values involved 13:35:44 greg says, you can use "<" + IF? 13:36:04 leeF: ORDER BY is more powerful than "<" 13:36:16 _:b < "foo" 13:36:51 _:b < "foo" is an error : ORDER will give _:b before "foo" 13:37:00 ack pgearon 13:37:42 pgearon: fn:MIN(MIN(?a), MIN(?b)) - why is this not identical to MIN(?a, ?b)? because of ORDER BY semantics? errors? something else? 13:38:01 AndyS: fn:min is an aggregate function in F&O - it takes one argument - a sequece 13:38:06 ... we don't have sequence types in SPARQL 13:41:38 AxelPolleres: how would people feel about re-opening ISSUE-53 to pass errors to the aggregates? 13:41:39 q? 13:41:41 q+ 13:41:51 ... COUNT would be defined to exclude thoes 13:41:56 ... MIN and MAX would exclude just those values 13:43:03 ack me 13:43:19 AndyS1 has joined #sparql 13:43:51 LeeF: My concern is more that errors and unbounds are treated the same way - unbounds in SPARQL seem so natural and innocnet that I don't see why they should have such a strong negative effect on the rest of a tuple passed to an aggregate 13:43:58 so this is AndyS' idea of using something other than Eval() in aggregate evaluation? 13:44:12 AndyS: we would need to change aggregate eval to special case an expression that was just a variable 13:44:22 SteveH: we'd also need a token for the unbound variable 13:44:53 -.05 on introducing NULL in SPARQL 13:45:58 ?x and ?x+0 (?x always a number or unbound) are then different 13:46:10 PROPOSED: reconsider the resolution on ISSUE-53 noting that tuples with errors passed to aggregate functions, and that the the aggregate function needs to define how tuples with errors are dealt with. COUNT excludes tuples with errors passed to the aggregate function 13:46:23 for whom that wouldn't work? 13:47:24 I would prefer to continue as we are now rather than go with that proposal, AxelPolleres 13:47:53 I'm not too happy with having to introduce an unbound token, either 13:50:20 AxelPolleres: notes conensus around multiargument MIN and MAX 13:50:26 SUM() will flatten the tuples, and apply ORDER BY semantics over the list 13:50:43 s/SUM/MIN 13:50:48 s/SUM/MIN and MAX()/ 13:51:07 AVG, GROUP_CONCAT, and SAMPLE 13:51:08 Definition: Avg 13:51:09 Avg(M) = Sum(M) / Count(M) 13:51:27 OK with me 13:51:59 AxelPolleres: this would limit us to single argument AVG 13:52:07 SteveH: potentially a reason for multiargument SUM 13:52:16 implies that AVG() is single argument too 13:52:20 bglimm: or an argument for all single argument aggregates! 13:52:27 AndyS: what about lots of zeroes? 13:52:27 need special case for |M| = 0 13:53:02 div by 0 is just an error, no special case needed. 13:53:12 Definition: GroupConcat 13:53:12 The multiset of values passed as an argument is converted to a sequence S. 13:53:12 GroupConcat(S) = fn:string-join(S, sep) 13:53:44 sep is currently suggested as " ", but ", " is better 13:54:15 we have a proposal for more syntax: GROUP_CONCAT["|"](?x) 13:54:20 AndyS, do you want GROUPCONCAT or something else? 13:55:01 kasei, yes - I'd write a GroupConcat as I write isIRI but case insensitive keywords 13:55:25 ☃ 13:56:30 2nd alt. GROUP_CONCAT[seperator="|"](?x) 13:57:17 SEPARATOR("|",GROUP_CONCAT(?x)) 13:57:24 2nd alt. GROUP_CONCAT[seperator="|", order_by="desc"](?x) 13:57:49 on consideration, I think I like Andy's GroupConcat 13:58:04 Why not GROUP_CONCAT(?s, "|") 13:58:07 scratch mine, I don't like it 13:58:16 GROUP_CONCAT("|")[?x] 13:58:25 MIN[?X] ... 13:58:31 require the separator and place it as the first arg 13:58:32 SUM[?X] .... 13:58:33 Custom agg example? 13:58:42 custom:agg[?x] 14:00:10 q+ 14:00:18 SUM«?x» :) 14:01:05 AxelPolleres: what about square brackets for all aggregates? 14:02:13 ivan, steveH: people expect to see '(' ')' for aggregates. 14:02:26 custom:agg[](?x) 14:02:56 or custom:agg[?x] 14:03:03 group_concate[","](asfasfa) 14:03:07 i like the idea of supporting order_by, also, though. 14:03:43 GROUP_CONCAT(x SEPARATOR ",") 14:03:49 q+ 14:03:57 q+ to claim that GROUP_CONCAT(?x "|") would work 14:04:03 sandro's idea: group_concat(a,b,c,separator=",') 14:04:24 +1 to group_concat(a,b,c,separator=",") 14:04:26 I like the keyword better than the square brackets. 14:04:26 ack AndyS 14:04:51 AndyS: problem with the use of a keyword is we need to define the keywords... if group_concat is special, i find it odd that you can't write a custom function that could do the same thing as group_concat 14:05:28 back to liking group_concat(",",a,b,c) - separator is req'd and is first arg 14:05:28 group_concat(list(a,b,c), ",") 14:05:30 group_concat(a,b,c separator=",") is nicer IMHO 14:05:48 q? 14:06:03 ack kasei 14:06:17 GroupConcat(?a,?b,?c [",",true]) # true is order desc 14:06:25 kasei: i like the ability of providing ordering, or at least being flexible enough to do it in custom aggregate functions 14:06:33 q? 14:06:53 GROUP_CONCAT(?x "|") 14:07:17 q+ 14:07:34 ack AxelPolleres 14:07:34 AxelPolleres, you wanted to claim that GROUP_CONCAT(?x "|") would work 14:08:11 (in RIF they don't need commas, much to my annoyance.) 14:08:12 GROUP_CONCAT[ ex:seperator "|" ; ex:order_by ?x ]( ?x ) # has issues with order by expressions, but runs with the similarity to bnode syntax. 14:08:22 GROUP_CONCAT[seperator="|", order_by="desc"](?x) 14:08:40 or GROUP_CONCAT["|", "desc"](?x) 14:09:06 can't you just do ORDER BY on a subquery and then GROUP_CONCAT that 14:09:16 MattPerry, yeah, you can 14:09:22 I'm very happy with named arguments, but maybe that's because I use python. 14:09:35 MattPerry, actually, no, aggregates can't preseve order 14:09:59 I think the most extensible thing is square bracket swith named params that affect the behavior of a function 14:10:11 LeeF, +1 14:10:12 GROUP_CONCAT["|" "desc"](?x) 14:10:17 don't care too much where the square brackets go, mainly because I think it's somewhat hideous in all cases :) 14:10:19 GROUP_CONCAT(a,b,c;d,e,f) (one more option... note the semi. I don't like it as much as names.) 14:10:46 q+ to speak about names 14:11:28 I like sandros GROUP_CONCAT(a,b,c;d,e,f) ; 14:11:39 ack AndyS 14:11:39 AndyS, you wanted to speak about names 14:11:44 q? 14:12:13 q+ 14:12:51 q+ to add propose that we not include GROUP_CONCAT in SPARQL 1.1 Query 14:13:06 break 14:13:11 Arbitrary keywords make tokenizing hard :: select= ... 14:16:11 There's no need for URIs or namespacing of argument names, decentralized extensibility, because they are scoped by the function name. 14:29:05 I'm not sure if it's on our agenda, but I think we ought to discuss the semantics of grouping by expressions 14:31:53 pgearon has joined #sparql 14:44:56 Nice trick: use query string to URIs for custom aggs (?x, ?y) 14:45:14 OPTION 1: agree on separation between two argument lists (Agg, Func) 14:45:15 OPTION 1.1: agg[Func](Agg) - steveH1 14:45:15 OPTION 1.2: agg(Agg; Func) - sandro1 14:45:15 OPTION 1.3: agg[FuncNamed](Agg) - steveH2, here FuncNamed is a list of named functional arguments (e.g. f1=Func1, f2=Func2) 14:45:15 OPTION 1.3: agg(Agg FuncNamed) - sandro2 14:45:16 OPTION 2: drop functionally parametrises Aggs at all 14:45:18 OPTION 2.1: we can still include GROUP_CONCAT without separator character (would still allow to solve Steve's use case, but without order) 14:46:02 While I like named arguments, I think there are practical difficulties. 14:47:29 OPTION 2.2: omit GROUP_CONCAT from SPARQL 1.1 Query 14:47:44 s/OPTION 1.3: agg(Agg FuncNamed) - sandro2/OPTION 1.4: agg(Agg FuncNamed) - sandro2/ 14:49:03 scribenick: AlexPassant 14:50:38 OPTION2.3: GROUP Concat with fixed separator 14:52:12 once again all options... 14:52:13 OPTION 1: agree on separation between two argument lists (Agg, Func) 14:52:14 OPTION 1.1: agg[Func](Agg) - steveH1 14:52:14 OPTION 1.2: agg(Agg; Func) - sandro1 14:52:14 OPTION 1.3: agg[FuncNamed](Agg) - steveH2, here FuncNamed is a list of named functional arguments (e.g. f1=Func1, f2=Func2) 14:52:15 OPTION 1.4: agg(Agg FuncNamed) - sandro2 14:52:16 OPTION 2: drop functionally parametrises Aggs at all 14:52:18 OPTION 2.1: we can still include GROUP_CONCAT without separator character (would still allow to solve Steve's use case with the multi-argument version and then removing the trailing separator, but without order ) 14:52:21 OPTION 2.2: omit GROUP_CONCAT from SPARQL 1.1 Query 14:52:23 OPTION 2.3: GROUP_CONCAT with fixed separator 14:55:05 Andy, steveH discussing parsing/grammar of FuncNamed 14:55:26 AxelPolleres: Summary of options 14:55:46 ... overall design decision 14:55:55 ... allow or not extra functional arguments 14:55:59 ... option 1 and 2 14:56:02 ... + suboptions 14:56:25 ... any objection re. we need the fonctional parameter 14:56:37 ivan: we need it 14:56:37 I object to option 2 14:56:47 pgearon, why? 14:56:49 ... limites use if we dont have it 14:56:58 2.2! 14:57:07 ... option 2 only if 2.2 14:57:26 q? 14:57:29 ack kasei 14:57:30 AxelPolleres: agreement on the suboptions ? 14:57:33 q? 14:57:34 I agree with LeeF's use case. I also think that it's useless without being able to specify the separator 14:57:34 ack LeeF 14:57:34 LeeF, you wanted to add propose that we not include GROUP_CONCAT in SPARQL 1.1 Query 14:57:46 LeeF: designing new stuff that we have not done yet 14:57:55 q+ 14:58:02 q+ 14:58:02 ... group_contact extremely useful but dont know the degree of extensibility 14:58:12 ... maybe should not do it 14:58:23 SteveH: disagree with LeeF and ivan 14:58:31 ... useful and stupid not to have it 14:58:47 ... would lead to lots of incompatible implementation if not standardised 14:59:07 q? 14:59:13 ack SteveH 14:59:22 LeeF: fixed sep not a good idea 14:59:23 q+ to argue that named arguments are extensible, and just put them at the end. 14:59:34 ... ', ' if fixed separater 14:59:47 ... but still get implementations changing it to make it useful 15:00:19 kasei: extensions will have this need 15:00:32 ... encouraging implementations to pursue on their own 15:00:44 LeeF: different approaches, but will learn from it for next time 15:01:00 ivan: not talking about something really complex 15:01:08 ... all prog. languages have it 15:01:10 objections to OPTION 2.3 Lee, Greg ? objection to OPTION 2.2 Steveh? 15:01:11 ... trivial detail 15:01:24 q? 15:01:26 ... would generally be happy with any suboption 15:01:33 LeeF: disagree - not trivial 15:01:38 q? 15:01:57 ack kasei 15:01:58 kasei: ivan summarised my point 15:02:17 ... clearly needed, fairly simple thing 15:02:23 ... issue is syntax based 15:02:25 ack kasei 15:02:57 q+ 15:03:08 pgearon: semantics is straightforward 15:03:11 ack sandro 15:03:11 sandro, you wanted to argue that named arguments are extensible, and just put them at the end. 15:03:15 ... concern is the syntax 15:03:28 sandro: keyword argument is straightforward 15:03:31 ... cf python 15:03:37 ... extensibility: dont need to be URI 15:03:49 ... the function specifies how you interpret the keywords 15:04:04 AxelPolleres: arguing for 1.1 ? 15:04:08 ivan: yes 15:04:12 If sandro arguing to chnage all function in SPARQL? 15:04:26 sandro: not sure of punctiation between arguments, but yes 15:04:37 sandro arguing for OPTION 1.4 15:04:39 AxelPolleres: arguments should be named ? 15:04:41 sandro: yes 15:04:42 q? 15:05:04 SteveH: they're not functions, they're aggregates 15:05:16 ... nervous about combining function syntax and aggregated syntax 15:05:17 ack SteveH 15:05:34 steveH "foo=bar" looks lot like an Expression ? 15:05:57 SteveH: not evaluated as functions 15:06:03 +q 15:06:16 ... execution model is different 15:06:22 q+ to compare FuncNamed option 1.4 to Ruby map arguments 15:06:23 ... helps if we're clear about that 15:06:24 q+ to ask about foo=bar really different from Expressions? 15:06:26 q? 15:06:35 ack pgearon 15:06:53 pgearon: already understand what the evaluation is supposed to be 15:07:00 ... matter of syntax for expressing what we want 15:07:08 ... fine w./ having a fixed separator 15:07:16 ... can be syntactically clear about what we want 15:07:22 ... fine with sandro proposal 15:07:22 group_concat(a,b,c,d ; separator=",') 15:07:32 s/fixed separator/argument separator 15:07:34 s/fixed separator/fixed argument separator 15:07:46 paul fine with separator character, e.g. Option 1.2? 15:08:13 AxelPolleres: 2 things: functional arguments shoud be named or not + separator 15:08:21 q+ to ask about ; specifically 15:08:41 OPTION 1.5 = OPTION1.2+OPTION 1.4 15:08:51 doSomething(a,b, :foo => "bar", :fiz => "baz") in Ruby - keywords aren't fixed 15:08:52 group_concat(a,b,c,d ; separator=",", desc=true) ???? 15:09:24 q+ to wonder why we wouldn't do this same thing for scalar functions if we really do this 15:09:41 q? 15:09:51 q- 15:09:52 dcharbon2: not familiar w/ python but sounds good 15:10:01 ack Axel 15:10:01 AxelPolleres, you wanted to ask about foo=bar really different from Expressions? 15:11:32 AxelPolleres: looks like expressions 15:11:53 ... personally not in favor of the " keywords = " 15:12:03 ... objections re. existing opsions ? 15:12:26 group_concat(a,b ; separator -> ",") to make it look like rif ? 15:12:52 ... LeeF objects fixed separator 15:12:59 ... sandro objects with [] 15:13:01 s/LeeF/LeeF and kasei/ 15:13:08 ... left are: 1.2 15:13:17 ivan ,What does that mean in RIF (/me behind the times)? 15:13:23 ... 1.4 + 1.5 15:13:36 ... 2.1 15:13:47 ... group concat without separator 15:14:13 OPTION 1.2: agg(Agg; Func) - sandro1 15:14:23 OPTION 2.1: we can still include GROUP_CONCAT without separator character (would still allow to solve Steve's use case with the multi-argument version and then removing the trailing separator, but without order ) 15:14:48 ... 1.2 -> last option w/out objections 15:14:48 q? 15:15:12 AndyS: 1.2. is confusing 15:15:16 ... style-wise 15:15:19 SteveH: agrees 15:15:59 group_concat(a,b ; separator -> ",") 15:16:15 group_concat(a,b ; separator = ",") 15:16:42 group_concat(a,b | separator -> ",") 15:16:59 SteveH: is ; an arbitrary choice ? 15:17:02 group_concat(a,b | separator = ",") 15:17:15 group_concat(a, b, separator = ",") 15:17:32 ';' would be confusing 15:17:32 ... asking if there's a particular reason 15:17:39 q? 15:17:47 ack SteveH 15:17:47 SteveH, you wanted to ask about ; specifically 15:17:47 ack SteveH 15:17:50 ack me 15:17:50 LeeF, you wanted to wonder why we wouldn't do this same thing for scalar functions if we really do this 15:19:12 AxelPolleres: why the second one needs to be named, not the first one 15:19:22 ... would have been happy with ; without names 15:19:30 SteveH: names make more obvious there are different 15:19:32 All in favor of group_concat(a, b, separator = ",") ? 15:19:46 q+ 15:20:04 Souri: 2 kind of arguments 15:20:12 All in favor of group_concat(a, b; separator = ",") ? 15:20:12 ... different kind of parameters 15:20:20 ... why they cant have differnet ways of specifying ? 15:20:49 there's only expressions, and parameters, not two kinds of parameters 15:21:04 Would anyone object against either group_concat(a, b; separator = ",") or group_concat(a, b | separator = ",") 15:21:11 either is OK for me 15:21:18 +1 +1 15:21:19 Pref ; 15:21:19 2nd one 15:21:28 +1 "|" 15:21:32 either is ok 15:21:36 +1 +0.5 15:21:42 +1 "|" 15:21:43 pref ; 15:21:50 ok for both 15:21:52 aesthetically, I like ; but I appreciate SteveH's concern and am happy with | 15:21:53 no pref 15:21:57 q+ to allow a default 15:21:59 group_concat(a, b | separator = ",") seems to have the majority 15:22:00 Isn't | list tail in some languages isn't it? 15:22:04 no pref on separator, uncomfortable with the whole lot 15:22:08 prefer |, but not strongly 15:22:12 yes AndyS 15:22:46 ! 15:22:48 f(a, 1|2, 3) 15:23:00 I thought it was || 15:23:01 how about "--" as the separator 15:23:10 AndyS: dont have | at the moment, but... 15:23:55 PROPOSED: GROUP_CONCAT syntax shall be GROUP_CONCAT(a, b; separator = ",") 15:24:08 +1 15:24:08 +1 15:24:12 +1 15:24:13 +1 15:24:14 +1 15:24:15 +1 15:24:16 +1 15:24:18 amen = 1 15:24:24 +1 15:24:38 0 15:24:38 q? 15:24:39 RESOLVED: GROUP_CONCAT syntax shall be GROUP_CONCAT(a, b; separator = ",") 15:24:42 I abstain. 15:24:43 AxelPolleres: also general mechanism for any parameterised function 15:24:56 Souri: wanted to mention the typical case 15:25:01 ... chose one character to be default 15:25:08 ... so 2nd part can be optional 15:25:13 +1 to a default 15:25:15 ... comma or space make sense 15:25:21 LeeF: comma is good 15:25:32 space 15:25:54 AxelPolleres: can we leave it to the editors ? 15:26:01 dafault separator is currently " " 15:26:06 q? 15:26:09 ack Souri 15:26:09 Souri, you wanted to allow a default 15:26:11 q- 15:26:13 ack Souri 15:26:31 AxelPolleres: last aggregate - SAMPLE 15:26:42 ... multiparameter in group_concat ? 15:27:06 no 15:27:19 btw, should we discuss AndyS's comment regarding _ in group_concat ? 15:27:35 do we have a scalar CONCAT function? 15:27:42 kasei, not at the moment 15:27:48 PROPOSED: to keep GROUP_CONCAT single expression 15:27:56 abstain 15:27:57 then I think multi-expression is desirable 15:28:08 group_concat(c1||c2||c3) 15:28:20 +1 15:28:46 Souri: dont have a syntax 15:28:51 LeeF: part of the function library 15:28:56 what I'd want is GROUP_CONCAT(CONCAT(" ", ?latitude, ?longitude)) 15:29:30 LeeF: not decided but will probably be in the function library 15:29:31 kasei, GROUP_CONCAT(CONCAT(?key, "=", ?val)) is a good example of that 15:29:41 we do that a lot 15:29:45 fn:string-join is two arg string concat 15:29:46 yeah 15:29:46 +1 15:29:54 so let's just remember that we want a scalar CONCAT 15:29:58 AxelPolleres: can we resolve the single expression GROUP CONCAT ? 15:30:09 RESOLVED: to keep GROUP_CONCAT single expression, one abstain, no objections 15:30:11 Sorry - I'm wrong - fn:concat N-ary 15:30:12 s/GROUP CONCAT/GROUP_CONCAT 15:30:21 AxelPolleres: next: SAMPLE 15:30:27 ... should be pretty clear 15:30:35 ... just need to figure out if that's multi expression 15:31:10 SteveH, pgearon abstaining to above resolution 15:31:35 agreement to keep SAMPLE single expression 15:31:39 ? 15:31:42 +1 15:31:49 q+ 15:32:13 COALESCE(SAMPLE(?name), SAMPLE(?fullname)) 15:32:15 SteveH: e.g. want to pick some random names 15:32:33 ... not sure that's a strong enough usecase 15:33:01 could be done with a UNION, it seems. 15:33:21 kasei - I don't understand the nested aggregates 15:33:24 CONCAT(SAMPLE(?name), SAMPLE(?fullname)) ? 15:33:40 sample(coalesce(?name,?fullname)) 15:34:39 q? 15:35:10 Souri: taking a sample with 4 values - some are NULL, can he SAMPLE select NULL as well ? 15:35:17 q- 15:35:41 AxelPolleres: done with aggregates 15:35:48 so did we agree on only single-arg sample? 15:35:55 yes 15:36:03 ... next: addressing extensibility in the spect 15:36:09 ... would like to leave this to the editors 15:36:19 ... "agregated extensibility" section 15:36:30 s/agregated/aggregates/ 15:36:43 aggregator extensibility section should go into spec... http://www.w3.org/mid/1777E22E-928C-4F75-8623-606FC0042454@deri.org 15:37:02 ... next: ISSUE-41 15:37:12 ... what do we allow in GROUP BY 15:38:17 SteveH: expressions are complicated 15:38:22 ... discussed in f2f2 15:38:50 kasei: used expressions in GROUP BY 15:38:52 ... was useful 15:39:19 ... pulled in out in the projection 15:39:51 AxelPolleres: use-case of Emmanuelle 15:39:54 ... related to the topic 15:40:00 Can do it with an assignment ^h^h^h^h^h^h^h subSELECT with expression 15:40:07 can you project out of a subquery and then group by that in the outer query? 15:40:09 is this dumb? and/or would it solve this problem? GROUP BY (?a+?b AS ?c) 15:40:20 ... but a bit ugly 15:41:20 { SELECT (?a + ?b AS ?c), * ... } 15:41:33 kasei - more consistent with SELECT needing AS but problem seems more to be about ?a and ?b scope in key/parition 15:41:37 AxelPolleres: not a variable that is projected 15:42:01 AndyS, i would think they disappear and only ?c is relevant in the key/partition 15:43:02 ... could be solved with subselect that projects the variable 15:43:05 kasei - yes - that;s the mechanism I'd expect. (ARQ introduces vars if needed so AS isn't required) 15:43:07 ... would not lose expressivity 15:43:16 example of Matt's suggestion in SQL: select max(deptno) from (select deptno, (case deptno when 10 then 'TEN' else 'OTHER' end) z from scott.emp) group by z; 15:43:22 ... propose to have only variables in GROUP BY 15:45:29 Is the following currently possible? 15:45:33 PREFIX : 15:45:33 SELECT ?auth ?name (AVG(?numberOfBooks) AS ?averageNumberOfBooks) 15:45:33 WHERE { ?auth :name ?name 15:45:33 { 15:45:34 SELECT ?auth (COUNT(?book) AS ?numberOfBooks) 15:45:34 WHERE { 15:45:36 ?auth :wrote ?book . 15:45:38 } 15:45:40 GROUP BY ?auth 15:45:42 HAVING (?numberOfBooks > 5) 15:45:44 } 15:45:53 admittedly somewhat orthogonal 15:47:59 Currently: [20]   GroupCondition   ::=   ( BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var ) 15:49:38 AxelPolleres: re. emmanuelle comment - author and name are projected 15:49:44 ... would not be allowed ? 15:49:49 and [19]   GroupClause   ::=   'GROUP' 'BY' GroupCondition+ 15:49:54 LeeF: cant do that 15:50:33 SteveH: legal in SQL 15:51:00 In SPARQL -- SELECT ?auth SAMPLE(?name) (AVG(?numberOfBooks) AS ?averageNumberOfBooks) 15:51:52 because outer is a GROUP BY implicitly to get AVG 15:52:38 that query is allowed, but emanuele's intended behaviour could be achieved with a subquery 15:55:34 agreement to go forward with what's in the current grammar (variables and renames allowed in GROUP BY) 15:56:31 PROPOSED: Close ISSUE-41 with the agreemen to go forward with what's in the current grammar (variables and renames allowed in GROUP BY) 15:56:41 +1 15:56:49 so long as "renames" means expressions with optional renaming. 15:56:50 +1 15:57:04 +1 -- as per kasei 15:57:39 Is GROUP BY (?a+?b) legal? Yes. 15:57:46 PROPOSED: Close ISSUE-41 with the agreemen to go forward with what's in the current grammar 15:57:49 +1 15:57:54 +1 15:57:58 +1 15:57:59 +1 15:58:03 +1 15:58:09 +1 15:58:12 +1 15:58:16 RESOLVED: Close ISSUE-41 with the agreemen to go forward with what's in the current grammar 15:58:21 close ISSUE-41 15:58:21 ISSUE-41 Does GROUP BY allow variables or expressions, and does it allow mutiple expressions? closed 15:58:38 AndyS: question about HAVING 15:58:47 ISSUE-41: resolved with the agreement to go forward with what's in the current grammar 15:58:47 ISSUE-41 Does GROUP BY allow variables or expressions, and does it allow mutiple expressions? notes added 15:59:04 What about the following: SELECT (COUNT(*) AS ?C) .... HAVING (COUNT(*) > 0 ) legal? I.e. same agg in two places, one HAVING 16:00:00 ... Is that allowed ? think so 16:00:12 SteveH: lots of complications 16:00:22 question about complications actually 16:00:35 it becomes one group 16:01:16 q? 16:01:46 AxelPolleres: is there an issue on that ? 16:01:50 AndyS: just checking if that works 16:01:59 should we have a test case along these lines? 16:02:04 SELECT (COUNT(*) AS ?C) .... HAVING (?C > 0 ) 16:02:43 AndyS: want to group something if the count is >0 and want also to return the count value 16:02:51 i want to say projection happens too late for that 16:03:12 main question is: Do we do HAVING before or after projection? 16:03:50 Agreement that not the second not allowed. 16:03:51 HAVING (?C > 0 ) would not work in SQL 16:03:52 AxelPolleres: agreement to allow the frst one, not sure about the 2nd 16:04:01 if the first one happens, but projection happens before HAVING, then the COUNT(*) leaks through if you're not selecting it. 16:04:08 LeeF: fine 16:04:30 agreement to disallow projected variables being reused in HAVING 16:04:33 AxelPolleres: disallow projected variables in having 16:04:46 ... will be reflected in the spec 16:05:01 ACTION: steveH to disallow projected variables being reused in HAVING in the spec 16:05:01 Created ACTION-209 - Disallow projected variables being reused in HAVING in the spec [on Steve Harris - due 2010-04-02]. 16:05:25 ... looks like aggregates are done 16:05:35 topic: NOT EXISTS vs. MINUS 16:05:54 ... next: NOT EXISTS / MINUS 16:06:33 SteveH: preference for the MINUS 16:06:37 ACTION: Axel to draft a testcase for SELECT (COUNT(*) AS ?C) .... HAVING (COUNT(*) > 0 ) 16:06:37 Created ACTION-210 - Draft a testcase for SELECT (COUNT(*) AS ?C) .... HAVING (COUNT(*) > 0 ) [on Axel Polleres - due 2010-04-02]. 16:06:39 ... much easier to optimise 16:08:02 (5Store example - other engines differ) 16:08:11 ... OPTIONAL in NOT EXISTS 16:09:03 pgearon: also already implemented the MINUS semantics 16:09:56 SteveH: what happen in NOT EXISTS semantics if introducing a new variable ? 16:10:28 WHERE {

?o . NOT EXISTS { ?p ?o } } 16:11:56 ericP: MINUS in the spec seems comparable to the one I have 16:12:07 ... right side has correspondence with the left side 16:12:16 ... substrct an empty set -> not eliminating anything 16:12:26 s/substrct/substract 16:14:39 .. cardinality for any particular solution is 0 16:16:27 SteveH: objection if NOT EXISTS only takes BGP + FILTER ? 16:16:39 kasei: can imagine also scoping to a Named Graph 16:17:30 NG with special case of GRAPH { ...} - several new grammar rules. 16:18:32 ericP: downside of using MINUS ? 16:18:42 AndyS: closest to the OPTIONAL NOT BOUND 16:18:43 q+ 16:19:24 yeah, def. would need new grammar rules. it's something like (GraphGraphPattern* + TriplesBlock* + Filter?)* 16:19:49 pgearon: trying to make algrbraic sound for construct that have no practical purposes 16:19:59 GraphGraphPattern needs to restrict to a TripleBlock not a general pattern 16:20:12 ... if different people implement diferently - it will not impact 16:20:24 AndyS, yes, that too. 16:20:29 very messy 16:20:50 but simpler after you finish with parsing. 16:21:09 ack pgearon 16:21:46 ericP: does NOT EXISTS rely on compability f? 16:22:01 AndyS: no, like having a FILTER + sub-ask in it 16:22:12 ericP: algebra available? 16:22:44 http://www.w3.org/2009/sparql/docs/query-1.1/rq25.xml#defn_exists 16:23:25 AxelPolleres: feeling that won't get an agreement 16:24:00 sandro: can we just provide both semantics 16:24:09 ... people coule implement either one and be correct 16:24:20 ... talking about the semantics not the syntax 16:24:33 { a b c { a b c { a b c 7 7 7 7 8 8 8 8 MINUS 7 7 7 } = 8 8 8 } 7 7 7 8 8 8 } 16:24:53 stupid linefeed compressing 16:25:39 { a b c { a b c { a b c 7 7 7 7 8 8 8 8 MINUS 7 7 7 } = 8 8 8 } 7 7 7 8 8 8 } 16:25:48 !!! 16:26:23 { a b c { a b c { a b c 16:26:30 7 7 7 7 8 8 16:26:38 8 8 MINUS 7 7 7 } = 8 8 8 } 16:26:47 7 7 7 16:26:53 8 8 8 } 16:27:16 what does NOT EXISTS do? 16:27:58 ericP, I don't think you can capture the difference solely by looking at solution sets 16:28:02 I think you need the query & the data 16:28:24 because I think the difference lies in how the Diff() operator is universally quantified over compatible solutions (or something like that) 16:28:33 (but i am likely very confused) 16:28:35 LeeF, you may be right, but I'd guess that it's the same in this example. 16:28:37 sandro: both semantics and then editorial change if we can get both simpler ? 16:28:42 kasei, right, i agree 16:28:47 (with the NOT EXISTS syntax) 16:29:40 PROPOSED: Use the NOT EXISTS, with semantics which defined ONLY when the not-exists and minus semantics are the same. Hopefully we'll find a clear way to express that in the spec. 16:29:49 PROPOSED: Use the NOT EXISTS syntax, with semantics which defined ONLY when the not-exists and minus semantics are the same. Hopefully we'll find a clear way to express that in the spec. 16:29:59 PROPOSED: Use the NOT EXISTS syntax, with semantics which are defined ONLY when the not-exists and minus semantics are the same. Hopefully we'll find a clear way to express that in the spec. 16:30:04 0 16:30:16 regardless of the query, if you var-substitute the 7s and 8s on the lhs into whatever rhs patter you have, I think you know it will match given the rhs resultset from above. 16:30:56 I think they are the same in Eric's example but need to see query to be sure 16:31:19 LeeF: difference can not be explained easily 16:31:19 I'm OK with what Sandro proposes, but I prefer the MINUS syntax (since it's implicitly a binary operator, and a single word) 16:32:16 NOT EXISTS and restricted syntax ? 16:34:16 ericP: take advantage of existing implementaion of understanding ? 16:34:32 ivan: more interested in people's understanding 16:34:35 proposals on the table... 16:34:39 - agree on syntax NOT EXISTS, try to unify semantics (sandro) 16:34:39 - agree on syntax MINUS, try to unify semantics (paul) 16:34:39 - NOT EXISTS with restricted syntax (andy) 16:34:40 ? 16:34:55 +q 16:34:56 SteveH: given none of us can distinguish NOT EXISTS and MINUS 16:35:03 ... issue re. how users would do it 16:35:18 ivan: how to explain without 'algebra', 'joint', etc. 16:35:36 q+ 16:35:38 SteveH: everything on the right is removed from the lest 16:35:43 s/lest/left 16:35:43 {Left} MINUS {Right} 16:35:54 ... my point is that there's no different 16:35:59 PROPOSED: Use the NOT EXISTS syntax, with semantics which are defined ONLY when the not-exists and minus semantics are the same. Hopefully we'll find a clear way to express that in the spec. 16:36:13 (I don't care which syntax, myself) 16:36:34 kasei: differnet implementers will find what's the easiest way to implement 16:36:45 ericP: concenred about the transformation challenge 16:37:05 ... easy in SQL semantics 16:37:11 ... need to get clear and simple semantics 16:37:28 AxelPolleres: 3 proposals 16:38:15 ... sandro ; pgearon -> sandro + s/NOT EXISTS/MINUS ; AndyS -> restrict the syntax 16:38:43 Two question: which syntax, and whether to restrict the syntax or just not specify the semantics where they conflict. 16:43:17 AndyS: SQL needs to get the same columns on left and right 16:43:22 what are the diffs between SQL MINUS and proposed SPARQL1.1 MINUS? 16:43:44 ... set difference between the 2 cols 16:44:04 ericP: difference between SQL and SPARQL both in the joint and the minus 16:45:21 AxelPolleres: no convergence of the WG 16:45:31 ivan: same issue for the lst 6 months 16:45:40 ... will be in the same situation in 6 months 16:45:50 ... sandro's proposal makes sense 16:46:04 AxelPolleres: agree on the syntax ? what about the semantics ? 16:46:23 sandro: 2 proposals: (1) which syntax and (2) using "merge semantics" 16:47:21 AxelPolleres: conditions would be contextual ? 16:47:32 sandro: resolving syntax first ? 16:48:31 ericP: what about NOT FOUND insteand of NOT EXISTS ? 16:48:35 ... open world issue 16:48:52 how about just NOT 16:48:54 eric: "NOT EXISTS" is blood in the water to Open World folks. 16:49:16 AndyS: NOT EXISTS is negation by failure 16:49:30 NAF 16:49:36 straw poll: what are your thoguhts on the syntax choice NOT EXISTS? 16:49:39 -1 16:49:40 0 16:49:43 0 16:49:44 +1 16:49:45 +1 16:49:46 1 16:49:47 +1 16:49:47 +! 16:49:47 +1 16:49:47 -1 16:49:48 +1 16:49:50 +1 16:49:51 -1 16:49:53 0 16:49:54 0 16:50:14 +8 / 4 / -3 16:50:40 straw poll: what are your thoughts on the syntax choice MINUS? 16:50:41 0 16:50:43 +1 16:50:47 0 16:50:47 -1 16:50:48 +0.5 16:50:48 0 16:50:49 0 16:50:49 +1 16:50:51 -1 16:50:53 -1 16:50:54 +1 16:50:56 0 16:51:00 +1 16:51:07 +1 16:51:27 +6 / 5 / -3 16:52:03 PROPOSED: Negation syntax is via the "NOT EXISTS" keywords 16:52:10 +1 16:52:13 +1 16:52:13 +1 16:52:20 0 16:52:22 +0 16:52:23 +1 16:52:31 +1 if someone can clearly specify the difference between the two semantics 16:52:52 RESOLVED: Negation syntax is via the "NOT EXISTS" keywords, bglimm and sandro abstaining 16:53:25 +χ 16:56:06 q+ 16:56:32 PROPOSED: SPARQL 1.1 Query defines semantics of NOT EXISTS that give the same results for both algebraic and procedural approaches and leaves other cases undefined 16:57:38 ack pgearon 16:57:47 AxelPolleres: 2 semanitcs that are both informative 16:58:02 pgearon: ivan mentioned users / implementers difference 16:58:12 ... implementers doing it because of a use-case 16:58:27 ... asked by users to go that way 16:58:36 ... each implementation come from user requirements 16:58:41 can we say "Normative only of OPTIONAL is not used in rhs"? 16:58:47 ivan: feeling is thqt 99% of use-cases will work with both semantics 16:59:03 pgearon: 100% will 16:59:06 Can we say "Normative only if OPTIONAL is not used in rhs"? 16:59:09 ack Souri 17:00:52 ack kasei 17:01:22 Souri: diffeent from the MINUS in SQL based on what goes in both sides 17:01:28 ... simlar way to UNION differences 17:03:06 Is that a reasonable way to go (rephrasing sandro)? 17:03:06 - put both semantics in 17:03:06 - put a *normative* restriction in that OPTIONAL is not allowed in rhs 17:03:07 - put an *informative* section that describes the differences of the 17:03:07 semantics when the restriction is dropped 17:03:51 { ?person a foaf:Person } NOT EXISTS { ?airplane a ex:Airplane } 17:03:53 ivan: MINUS can have - in some cases - the effect of not returning anything 17:04:05 ... 'patch' that backfires in kasei's case 17:04:10 Problem case was { ?s ?p ?o } MINUS {} => nothing 17:04:14 kasei: ading it to MINUS is irrelevant 17:05:11 { ?s ?p ?o } MINUS { ?x ?y ?z } => nothing 17:05:14 (as well) 17:05:30 +1 17:05:39 Souri has joined #sparql 17:05:47 break? 17:05:56 ericp: depends on data 17:05:57 q? 17:06:01 ericP, is that how it is now? i thought the patch prevented that? or the patch ensures that? 17:06:06 sorry - see the point now 17:06:40 ericP: no intersecting domain -> nothing substracted 17:06:56 ericP, then wouldn't { ?s ?p ?o } MINUS { ?x ?y ?z } => everything ? 17:07:16 LeeF, yes 17:07:52 { ?person a foaf:Person } NOT EXISTS { ?airplane a ex:Airplane } 17:07:58 {?s ?p ?o} NOT EXISTS {?x ?y ?z} => nothing 17:08:06 kasei: LeeF's pattern gives everyghin and NOT EXISTS gives nothing 17:08:24 ... ok with dropping optional in the right side but will affect implementations 17:08:51 "or dom(μ) and dom(μ') are disjoint" 17:08:53 don't really see the use case for { ?s ?p ?o } MINUS { ?x ?y ?z } 17:09:07 Minus(Ω1, Ω2) = 17:09:07 { μ | μ in Ω1 such that for all μ' in Ω2, 17:09:07 either μ and μ' are not compatible or dom(μ) and dom(μ') are disjoint } 17:09:35 LeeF: keep solutions on the left either not compatible not disjoint from the right 17:09:51 Axel, the only use-case I can think of is if a user defines the thing to take away from the LHS 17:11:04 reconvene at 10 to the next hour 17:11:06 Is this the email AndyS http://lists.w3.org/Archives/Public/public-rdf-dawg/2009JulSep/0137.html 17:11:32 Yes - thanks 17:12:43 http://lists.w3.org/Archives/Public/public-rdf-dawg/2009JulSep/0030.html 17:54:09 Diff: { μ | μ in Ω1 such that for all μ′ in Ω2, 17:54:09 either μ and μ′ are not compatible or μ and μ' 17:54:09 are compatible and expr(merge(μ, μ')) has an effective boolean value 17:54:09 of false } 17:54:26 (current 1.0 spec - diff is not exposed directly) 17:54:45 it's probably a typo if there is no overlap in variables. 17:56:11 ! EXISTS 17:56:15 NOT EXISTS 17:56:18 ? 17:56:40 I like NOT EXISTS 17:57:19 lee: why NOT EXISTS outside of FILTER? 17:57:29 andy: It's just a nice shorter form. 17:57:40 scribe: AxelPolleres 17:57:44 :-) 17:58:15 Andy: I would like NOT EXISTS as shortcut for the FILTER ! EXISTS 17:58:17 lee: I like to keep the mental models more clear 17:58:40 andy: why not put in a pure form of MINUS then? 17:59:33 { ?person a ex:Person } MINUS { ?airplane a ex:Airplane } 17:59:51 LeeF: people interested using the mental model of set subtract feel that in my example no persons should be lost 18:00:19 Andy: happy with that, allows optimisation 18:00:40 sandro: shouldn't that be a syntax error? 18:01:13 LeeF: proposal ... 18:01:42 PROPOSED: Include MINUS as a binary graph pattern operator and include EXISTS and NOT/! EXISTS as FILTER functions/constructs 18:01:44 +1 18:01:46 ... include MINUS as binary graph pattern OP and include EXISTS as FILTER... 18:01:48 +1 18:02:03 +.99 18:02:07 +1 18:02:08 +1 18:02:20 +1 18:02:21 +1 18:02:27 +0 18:02:31 +1 18:02:44 +1 18:02:48 +1 18:02:52 RESOLVED: Include MINUS as a binary graph pattern operator and include EXISTS and NOT/! EXISTS as FILTER functions/constructs, AndyS abstaining 18:03:22 marginal preference for !, dont dont care 18:03:44 if we require FILTER keyword, I support !, not NOT 18:03:46 Andy: ! Exists not possible outside the filter 18:04:08 ... but ! EXISTS not really clear. 18:04:34 Any: why not just make NOT synonymous to !? 18:04:51 EricP: don't want to dilute the grammar 18:05:49 s/Any/Andy/ 18:06:00 q+ 18:06:05 ack SteveH 18:06:05 LeeF: preference in Boston on ! EXISTS 18:06:27 q- 18:06:39 steve: if only in the FILTER then ASK could be reused instead of a new keyword. 18:07:18 andy: that's not what I had agreed on 18:07:25 s/on/to/ 18:07:35 PROPOSED: The EXISTS filter function is negated with a ! 18:07:38 +1 18:07:39 q+ 18:07:44 ack kasei 18:07:44 -1 18:08:21 +1 18:08:34 +1 18:08:43 q+ 18:08:46 greg: inside a FILTER it seems that '(' ')' enclosing the pattern would seem reasonable 18:09:01 ack AndyS 18:09:19 LeeF: I suggest to ask the editors to come up with a proposal in the draft and move on to other issues 18:09:37 Andy: curly braces because it is a pattern 18:10:47 LeeF: maybe get to other issues than query for the moment to get a break 18:10:49 topic: Entailment Issues 18:11:12 http://www.w3.org/2009/sparql/track/issues/28 18:11:23 Lee: ... talk about Entailment issues, we have a list of issues we probably can close. 18:12:44 Axel: Birte suggests to not tackle entailment vs. updates for this time i.e. close ISSUE-28 and ISSUE-40 18:12:58 PROPOSED: Close ISSUE-28 and ISSUE-40 by noting that our current work does not specify anything about the relationship between entailment regimes and SPARQL Update 18:13:03 +1 18:13:09 +1 18:13:11 +0 18:13:14 +0 18:13:14 +1 18:13:16 Souri has joined #sparql 18:13:18 0 18:13:22 q+ 18:13:26 ~0 18:13:42 RESOLVED: Close ISSUE-28 and ISSUE-40 by noting that our current work does not specify anything about the relationship between entailment regimes and SPARQL Update, sandro, steveh, axelpolleres abstraining 18:13:49 s/abstraining/ab straining 18:13:58 s/ab straining/abstaining 18:14:20 axel: There would be a solution, to say for entailment we take the scoping graph for matching, then for update we use the ... 18:14:23 ISSUE-20: resolved by noting that our current work does not specify anything about the relationship between entailment regimes and SPARQL Update 18:14:23 ISSUE-20 Graphs aware stores vs. quad stores for SPARQL/update (empty graphs) notes added 18:14:27 ISSUE-28: by noting that our current work does not specify anything about the relationship between entailment regimes and SPARQL Update 18:14:27 ISSUE-28 Entailment regimes vs. update? notes added 18:14:30 ISSUE-40: by noting that our current work does not specify anything about the relationship between entailment regimes and SPARQL Update 18:14:30 ISSUE-40 How can other entailment regimes plug in their semantics to SPARQL/Update? notes added 18:14:30 axel: So you couldn;'t remove inferred triples 18:14:35 trackbot, close ISSUE-28 18:14:35 ISSUE-28 Entailment regimes vs. update? closed 18:14:39 trackbot, close ISSUE-40 18:14:39 ISSUE-40 How can other entailment regimes plug in their semantics to SPARQL/Update? closed 18:14:52 +1 yeah, something like that sounds nice, but okay we're not ready to spec that. 18:15:06 Next issue: http://www.w3.org/2009/sparql/track/issues/34 18:15:26 birte: problem is that we don't have time to write all options down and have other issues to focus on... i.e. time doesn't allow 18:15:43 Birte: on the nexty issue 34 ... 18:16:29 ... we treat bnodes as blank nodes as skolem constants and so there's no issue. 18:16:42 s/bnodes as// 18:17:11 PROPOSED: Close ISSUE-34 by accepting the current clearly defined semantics of blank nodes 18:17:15 ... proposes to close the issue since the behavior of bnodes is clearly defined by that. 18:17:23 +1 18:17:24 + 18:17:25 +1 18:17:38 RESOLVED: Close ISSUE-34 by accepting the current clearly defined semantics of blank nodes, no objections or abstentions 18:17:43 +1 18:17:46 trackbot, close ISSUE-34 18:17:46 ISSUE-34 How do other entailment regimes interact with aggregate grouping vis a vis blank nodes? closed 18:17:50 no one objects/abstain 18:17:56 http://www.w3.org/2009/sparql/track/issues/42 18:18:16 LeeF: RDFS and inconsistencies... 18:18:50 Birte: applies to other entailment regimes with inconsistencies as well, all these have the same solution at the moment 18:19:16 ... we don't enforce consistency checks, but say that if inconsistencies are checked that should be returned to the user. 18:19:32 ... MAY in the RFC sense. 18:19:35 q+ 18:19:40 ack AxelPolleres 18:19:42 ack Souri 18:20:05 q+ 18:20:21 souri: we do actually point out if we find inconsistencies in OWL (at loading) 18:20:30 ack AndyS 18:20:39 PROPOSED: Close ISSUE-42 noting the current text that says implementations MAY check for inconsistencies and SHOULD raise an exception if they come across an inconsistency 18:20:41 ack AndyS 18:20:45 ... we could just answer with pointing out the inconsistencies 18:20:55 +1 18:20:59 Andy: if you have loaded correct data then it is not an issue. 18:21:00 +1 18:21:02 +1 18:21:03 +1 18:21:04 +1 18:21:06 RESOLVED: Close ISSUE-42 noting the current text that says implementations MAY check for inconsistencies and SHOULD raise an exception if they come across an inconsistency, no objections or abstentions 18:21:28 ISSUE-42: resolved by the current text in the document ( implementations MAY check for inconsistencies etc...) 18:21:28 ISSUE-42 TF-ENT What should happen for RDFS entailment in the face of inconsistencies? notes added 18:21:44 subtopic: finite answer criteria 18:21:49 trackbot, close ISSUE-42 18:21:49 ISSUE-42 TF-ENT What should happen for RDFS entailment in the face of inconsistencies? closed 18:21:51 Birte: current state ... 18:22:08 ... for RDF RDFS the main issues are infinite axiomatic triples. 18:22:45 q+ 18:22:51 ... at the moment, we return graph vocabulary, RDF(S) vocabulary, but not those infinite rdf:_n properties unless they occur. 18:23:15 ... RIF is more tricky, because infinity can occur through recursion over built-ins. 18:23:30 ... strongly safe fragment of RIF Core is fine. 18:24:04 ... sandro asked whether finiteness criterion is really useful. 18:24:06 q+ to ask about OWL 2 RL profile 18:24:54 sandro: can't see practical reasons for finiteness criterion. 18:25:16 ... think that's only from throeretical concerns. 18:25:41 ack Souri 18:25:41 Souri, you wanted to ask about OWL 2 RL profile 18:25:41 LeeF: sandro, you think that we should not satisfy the finiteness criterion for RIF Core? 18:25:54 q? 18:26:09 Souri: there's a separate issue for OWL2RL? 18:26:21 Birte: OWL2RL is fine. 18:27:00 Ivan: we felt in the Entailment-TF that we need the blessing of the group to drop the finiteness restriction 18:27:29 LeeF: extension mechanism says that we need to guarantee finiteness of answers 18:27:38 q+ 18:27:42 ack AxelPolleres 18:28:51 ivan: weaken finiteness restriction from MUST to SHOULD 18:29:06 Axel: I think we have to change the extension mechanism conditions in order to lift the restriction to finiteness. 18:29:17 PROPOSED: Update the SPARQL Query BGP entailment extension mechanism to weaken the requirement on finite answers to be a suggestion 18:29:22 q+ 18:29:28 +1 18:30:48 ack kasei 18:31:26 Axel: just asking whether there is a way to stream (infinite) results 18:32:30 Greg: for the RDF/RDFS case what if a term, that is entailed appears in the query but not in the queried graph, but is actually entailed? 18:32:54 Birte: We can take the graph + query vocabulary into account 18:33:15 ... that shouldn't be a problem. 18:33:17 PROPOSED: Update the SPARQL Query BGP entailment extension mechanism to weaken the requirement on finite answers to be a suggestion 18:33:21 q? 18:33:29 +1 18:33:34 +1 18:33:34 Axel: was thinking of that for D-entailment as well... taking the query vocab into account should solve that. 18:33:49 RESOLVED: Update the SPARQL Query BGP entailment extension mechanism to weaken the requirement on finite answers to be a suggestion, no objections or abstentions 18:34:03 s/MUST/SHOULD/ is the proposed text for Andy, probably...:-) 18:34:24 ACTION: Birte to email out the text change needed to weaken the finite answer criteria in SPARQL Query 18:34:24 Created ACTION-211 - Email out the text change needed to weaken the finite answer criteria in SPARQL Query [on Birte Glimm - due 2010-04-02]. 18:34:53 Andy: make sure that it's carefully worded. 18:34:57 http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JanMar/0468.html 18:36:19 Birte: please let's first discuss the other condition in the extension mechanism which says that the scoping graph needs to be uniquely defined... 18:37:07 is uniquely specified and is E-equivalent to AG. 18:37:24 ... should be rephrased 18:37:51 Birte: I suggest to send a rephrasing proposal for that one as well 18:37:58 ACTION: Birte to propose change to unique specified extension criteria 18:37:58 Created ACTION-212 - Propose change to unique specified extension criteria [on Birte Glimm - due 2010-04-02]. 18:38:11 (along the lines uniquely defined up to graph equivalence ?) 18:38:13 http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JanMar/0468.html 18:38:17 q+ 18:38:21 ack AxelPolleres 18:38:59 AxelPolleres: Since there are RDF stores that support datatype handline but not RDFS entailment... (1) this is not D-entailment (because that sits on top of RDFS entailment) 18:39:13 ... (2) what these stores do is convert literals with data types to an internal canonical form 18:39:20 "1.00"^^xsd:decimal is the same value as "1.0"^^xsd:decimal, but different lexical form 18:39:24 ... some of these would return the lexical forms of the original graphs and others would return only the canonical forms 18:39:29 ... two questions 18:39:37 ... Q1: does this influence the destination of D-entailment? 18:39:41 ... Birte convinced me "no" 18:39:44 ... so Q1 is fine 18:40:04 ... Q2: Should we also define a mini-entailment regime for these RDF stores that do datatype but not RDFS entailment? 18:41:39 G: :s :p 1 18:42:12 Q: ASK { :s :p "1.000"^^xs:decimal } 18:42:52 according to the current SPARQL document, I understand that this would return "NO" 18:43:02 (on simple entailment) 18:44:12 sandro: I would like to support something like D^-. 18:44:34 Andy: I wouldn't be implementing corner cases, probably. 18:44:37 Sandro: I think its important the RDF stores be allowed to store only their internal form of the data values. I don't want to force people to remember all the trailing zeros and whether it's xs:int vs xs:integer. 18:44:58 Paul: I store as much as I can of the original structure. 18:45:01 q+ 18:45:34 Paul: i internally convert a number to union of all the internal representations of that number. 18:45:36 AndyS: my stores store value for convenient ranges (e.g. +- 56 bits of precision for an integer) 18:45:47 saandro: isn't that expensive 18:46:03 paul: not that expensive. 18:46:09 and just store lexicial form style otherwise (out of range, bad lexical) 18:46:28 "3"^^xsd:byte 18:46:30 greg: how do you ask for 3 as a number? 18:47:29 sandro: If I put in 3.0000000....000000 you store all that? 18:47:40 paul: yes, because I got complaints 18:47:42 Value stores vs derived datatypes 18:47:50 q? 18:48:09 Also, currently because of NaN and Inf, TDB does not do xsd:double or xsd:float. 18:48:10 q+ 18:48:15 ack AxelPolleres 18:49:09 ack Souri 18:50:28 Andy: how does D-entailment require RDFS? 18:50:38 (found it) 18:50:57 Except for XMLLiterals. 18:51:01 Axel: D-interpretations are rdfs-interpretations 18:51:17 souri: if you have a join of "0.3000000" and "0.3000" , do they match, and which do you return 18:51:19 Souri: we do canonical value based matching in Oracle 18:51:26 lee: in SPARQL 1.0 they don't match. 18:51:32 ... so D^- would be welcome 18:52:02 sandro: any reasonable implementaiton would do that. 18:52:51 lee: "Value Entailment" ? 18:52:54 ... maybe we need a better name. 18:53:22 s/lee/Andy/ 18:53:24 +1 value entailment 18:53:26 LeeF: seems we need no resolution, but consensus that we should go forward with that. 18:53:46 .... i would prefer not to discuss rif:imports now. 18:54:02 Birte/Axel: ok to move that to the entailment-TF 18:54:03 (My expectation is that many/most serious SPARQL systems will do value-entailment only, since it's much more efficient.) 18:54:22 topic: service description 18:54:57 LeeF: what about saddle's supported resultformats part (we were asked in a comment) 18:55:11 uris like http://www.w3.org/ns/formats/rdfxml 18:55:15 greg: eric and sandro are working on some proposal for URIs for that. 18:55:37 a uri space for all formats that W3C knows/cares about, we can make a URI for them here. 18:56:07 ... we also will add mediatypes in the service description. 18:56:38 ... i.e. we will go format with both resultformats and mediatypes. 18:56:51 LeeF: more questions on that? 18:57:16 Ivan/sandro: discussing namespace reservation... 18:57:35 sandro: we need a resolution for that 18:58:28 PROPOSED: Request URIs of the form http://www.w3.org/ns/format/ to represent graph formats and SPARQL XML and JSON result formats 18:58:37 ivan: on andy's question for extensibility of formats such as TriG or N-Quads, that's not that simple. 18:58:40 PROPOSED: The SPARQL WG requests URIs of the form http://www.w3.org/ns/format/ to represent graph formats and SPARQL XML and JSON result formats 18:59:10 Andy: I was not asking for getting that in now, but just not to preclude that now. 19:00:02 Eric: we can't really do anything about the fact that ... 19:00:24 (eric can you type that in, can't really follow the argument) 19:00:50 PROPOSED: The SPARQL WG requests URIs of the form http://www.w3.org/ns/format/ to represent graph formats and SPARQL XML and JSON result formats 19:01:03 +1 19:01:11 +1 19:01:17 +1 19:01:30 +1 19:01:34 RESOLVED: The SPARQL WG requests URIs of the form http://www.w3.org/ns/format/ to represent graph formats and SPARQL XML and JSON result formats, no objections or abstentions 19:02:08 ivan: scheme will be such that we can use non-graph formats as well 19:02:30 ... N3 e.g. is not a standard, but there is a submission document, that'd work 19:02:47 ivan: got it thanks - http://www.w3.org/TeamSubmission/n3/ 19:03:09 sandro: as long as there's a stable spec for it, we're fine, practically. 19:03:37 subtopic: vocabulary to describe datasets 19:03:45 http://www.w3.org/2009/sparql/docs/service-description-1.1/xmlspec.xml 19:04:06 greg: look at example in Section 4 19:04:26 http://www.w3.org/2009/sparql/docs/service-description-1.1/xmlspec.xml#id0x106c0320 19:04:48 http://kasei.us/2009/09/sparql/sd-example.ttl 19:04:54 http://www.w3.org/2009/sparql/docs/service-description-1.1/xmlspec.xml#id0x1f954840 19:05:35 grep: explains the example. 19:05:43 s/grep/greg/ 19:06:45 sandro: you're saying here that the name is the graph 19:07:04 greg: two endpoints could have different local names for the same loaded graph 19:07:07 19:07:45 greg: seems strange to me to put name in a string 19:08:03 q+ 19:08:18 ... some pushback from people since these descriptions can get long. 19:08:29 matt has joined #sparql 19:08:33 q? 19:08:50 ack ivan 19:09:13 sandro: I have a problem with something have a "named" which is itself. 19:09:28 ivan: I wonder why you need a separate type for namedgraph and not just have a graph which happens to have a name property? 19:10:12 re: name as a literal: careful, this is area in which sandro has been painfully vigilant in the past 19:11:16 greg: we need to derefernce by which name you can query the graph. 19:11:42 Instead of sd:named ; say: sd:name "http://xmlns.com/foaf/0.1/" 19:11:45 ivan: i would be more comfortable on the statement about a string, not about the resource itself. 19:12:16 greg: ok, if there's consensus on that, but strange to me. 19:12:18 sandro: you're providing the name of the thing, not the thing itself. 19:12:25 sdLnamed vs. sd:named "foo"^^xsd:anyUri 19:12:26 ? 19:13:34 0 (string representation conceptually better, but needs conversion from string to resource if you want to use it?) 19:14:11 sandro: I think you need to put it in a literal to stop someone saying wrong things about the resource. 19:14:43 ACTION: Sandro to work with Greg on an example to investigate what happens when multiple descriptions of the same graph are merged together 19:14:43 Created ACTION-213 - Work with Greg on an example to investigate what happens when multiple descriptions of the same graph are merged together [on Sandro Hawke - due 2010-04-02]. 19:14:45 subtopic: powder 19:15:40 ivan: powder can be used in a practical deployment, our description of a big dataset would be lenghy, in powder you could do it in a few lines. 19:16:33 ivan: powder extends the RDF semantcis to bridge resources and their names. 19:17:11 leeF: does that mean we don't say something about the practicality of that form of descriptions for larger graphs/datasets? 19:17:21 ivan: we could put some text in the document. 19:17:42 s/some text/some informative text/ 19:17:55 sandro: just use sparql to query the vast sparql service description. 19:18:03 LeeF: so the answer is we could use POWDER for a lot of things, but it's not the default. 19:18:13 http://www.w3.org/2009/sparql/track/issues/43 19:18:23 subtopic: ISSUE-43 19:19:17 greg: the way this is modeled at the moment allows us to say in the context of this endpoint entailment X applies to that graph. 19:19:34 ... if we collapse the description, we loose that feature. 19:21:15 ivan: fine, I just asked why two different types of graphs. 19:23:37 in the graph we have entailmentRegime (per graph) and defaultEntailmentregime (for named graph), but at the moment we can't model specific entailment regime only for the default graph. 19:24:05 Greg: the vocabulary doesn't say you can request entailment, but that it is done on that graph. 19:26:06 greg: the only way that entailment regime helps you is to know which entailment is already done on it. 19:26:13 ... one entailment per graph 19:26:23 ivan: why? seems unnatural to me. 19:26:57 souri: we support parametric inference, i.e. you can ask that graph with that entailment... 19:27:18 q+ 19:27:24 q+ to say that you could have different endpoints per entailment regime 19:27:40 G1 |= G2 19:27:52 query G1 or G2 as you like 19:28:01 ack AxelPolleres 19:28:10 G1 |=owl G2 G1 |=rdfs G3 19:29:03 ...or http://foo.example/graph?entailment=owl 19:29:14 what you could do is allow FROM or FROM ... 19:29:21 G1 |=owl G4 AND G1 |=rdfs G4 G4 has both owl and rdfs. 19:30:05 I want to be able to write down "|=" in the service description. 19:30:23 q? 19:30:29 q+ 19:30:35 greg: we agreed not to describe how to reauest entailment 19:30:41 ack bglimm 19:30:41 bglimm, you wanted to say that you could have different endpoints per entailment regime 19:30:57 ivan: the information of how you can query a graph is valuable 19:31:22 [ a sd:Graph ; sd:preEntailmentGraph ; sd:entailmentRegime ent:DL ] 19:31:23 birte: another solution is that you can set up several endpoints, with several regimes, user chooses 19:32:02 (remark.... that is orthogonal to the entailment specific uris mentioned before) 19:32:28 We currently do one graph (name) = one entailment regime. Most commonly, entailment and base data. They actually share same base data but you can't tell. 19:32:59 q+ 19:33:37 birte: we only allow OWL, no parameterisation 19:33:38 ack sandro 19:33:40 q- 19:33:44 ack souri 19:33:54 steveH: we only support RDFS in threestore 19:34:10 souri: what about user defined rules. 19:35:03 axel: that should be possible with rif:imports 19:35:25 LeeF: so, do we want advertisement of entailmentregime per graph? 19:35:49 greg: seems simple to me to do that, but other issues mentioned are not SD's job for the moment 19:36:12 birte: what if a graph has several entailment regimes? 19:36:23 andy: cardinality 1 makes sense 19:37:00 q? 19:37:03 what about sd:defaultEntailment ent:xx ; sd:entailementRegime ent:YY 19:37:29 matt has left #sparql 19:38:03 axel: use case for multiple entailment regimes... you can always advertise additionally any "weaker entailments" than the strongest one you do, as long as the entailments strcitly subsume each other. 19:38:42 ACTION: greg to add ability to mark individual graphs with their entailment regime 19:38:42 Created ACTION-214 - Add ability to mark individual graphs with their entailment regime [on Gregory Williams - due 2010-04-02]. 19:38:51 q? 19:40:03 q? 19:40:05 q+ 19:41:00 q+ to ask whether we will have time to discuss further planning/publication (we need to) 19:41:21 http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JanMar/0566.html 19:41:50 LeeF: let's talk about further planning/publications rather on Tue in the next TC 19:42:01 ... let's go around the table now. 19:42:06 Update: {?x foaf:knows{2} ?y} as triple pattern rewrite may not be so easy 19:42:15 david: not filled in enough 19:42:21 ivan: same 19:43:04 leeF: restriction to retrieve duplicates might not be the right thing, e.g. following foaf:knows 8 times over several paths. 19:43:21 .... fine with negated properties, etc., N3 syntax, etc. 19:43:41 Alex: agree with allow duplicates, not up to dates with cycles. 19:44:54 Paul: loop, I was thinking it did match, but not several times 19:45:11 Souri: no duplicates is not a concern, allow duplicates also fine. 19:45:39 matt: repition of nodes difficult. 19:45:50 sandro: not followed. 19:46:06 greg: 0-length paths scare me. 19:46:12 AndyS: with no duplicates, SELECT COUNT(*) WHERE {?x foaf:knows{2} ?y} return 1, right ? (in the 1st example) 19:46:40 yes - think so 19:46:57 ok so Im definitely for allowing duplicate, seems more coherent in that count use case 19:47:09 distinct! 19:48:01 ?s :p? ?o 19:49:56 Axel: duplicates worry me 19:50:19 (see sixDegrees eaxample in my mail, that would blow up tremendously if we have duplicates) 19:50:33 steve: I am fine with Andy's proposal so far. 19:51:09 andy: can't think about anyting else important at the moment. 19:51:41 LeeF: eric is 98% done with the basic federated query spec. 19:51:51 cool 19:51:53 Andy: are there implications on protocol? 19:52:05 RRSAgent, make logs public 19:52:09 RRSAgent, pointer? 19:52:09 See http://www.w3.org/2010/03/26-sparql-irc#T19-52-09 19:52:38 LeeF: we want to go on Tue to ask editors for how documents are affected, how far we are from last call, 19:53:02 ... let's discuss all where we are in terms of schedule, not focus on technical issues. 19:54:20 LeeF: thanks all, thanks hosts, thanks scribes!!! talk on on Tuesday 19:54:31 adjourned 19:54:51 rrsagent, make records public 19:57:44 AndyS has left #sparql 20:01:23 SELECT * WHERE { ?s :* ?o } 21:32:48 AndyS has joined #sparql 22:34:37 AndyS has joined #sparql 22:34:52 AndyS has left #sparql 22:37:05 SteveH has joined #sparql 23:36:31 LeeF has joined #sparql