- From: Steve Harris <steve.harris@garlik.com>
- Date: Sun, 7 Feb 2010 23:25:00 +0000
- To: Andy Seaborne <andy.seaborne@talis.com>
- Cc: SPARQL Working Group <public-rdf-dawg@w3.org>
I have a preference for it being sameTerm, rather than =. Otherwise "1.0"^^xsd:decimal IN ("1"^^xsd:integer, "1.0e0"^^xsd:double) would be true, which seems counterintuitive to me. i.e. IN ==> sameTerm(expr, expr1) || sameTerm(expr, expr2) || ... NOT IN ==> !(sameTerm(expr, expr1) || sameTerm(expr, expr2) || ... ) It's always possible to cast the LHS is you want a more lax IN predicate - xsd:integer(?x) IN (1, 2, 3). In terms of semantics I prefer the first option, I think. - Steve On 7 Feb 2010, at 20:42, Andy Seaborne wrote: > Proposal for the IN operator. > > > IN is a operator with the same precedence as EQ etc. > > Syntax: > expr IN ( expr1, expr2, ....) > expr NOT IN ( expr1, expr2, ....) > > e.g. > > FILTER ( ?x IN ('a', 'b', 'c') ) > FILTER ( ?x NOT IN ('a', 'b', 'c') ) > > (SQL has NOT IN and !(expr IN ( expr1, expr2, ....)) is clunky) > > Semantics: > > Evaluation is equivalent to writing out in long form: > > IN ==> > expr = expr1 || expr = expr2 || ... > > NOT IN ==> > expr != expr1 && expr != expr2 && ... > > That makes IN a special form like || and && already are. The > arguments are not all evaluated first, then the operator itself > called. If the result can definitely determined > > 8 IN (1, 2, 3) is false > 9 IN (1, 2, 1/0) is error > > 1 IN (1, 1/0, 3) is true > 1 IN (3, 1/0, 1) is true > > because in SPARQL 1.0: > 1 = 3 || 1 = 1/0 || 1 = 1 > is true > > 8 NOT IN (1, 2, 3) is true > 9 NOT IN (1, 2, 1/0) is error > > 1 NOT IN (1, 1/0, 3) is false > 1 NOT IN (3, 1/0, 1) is false > > because in SPARQL 1.0: > 1 != 3 && 1 != 1/0 && 1 != 1 > is false > > The outcome of evaluation is independent of argument order. > > Alternatives: > > Alt 1: Strict function: the arguments are all evaluated first so any > error means the expression is an error. > > 1 IN (3, 1/0, 1) is error > 1 IN (1, 1/0, 3) is error > > but it does mean all arguments must be evaluated even if not needed. > > Alt 2: Left-right evaluation: > If an error is encountered, the expression is an error > but the evaluation stops if true for IN or false for NOT IN is > encountered. The order of the arguments now matters: > > 1 IN (3, 1/0, 1) is error > 1 IN (1, 1/0, 3) is true > > and it isn't a rewrite to || and = anymore. > > I prefer the rewrite to "=" and "||" version. > > Andy > -- Steve Harris, Garlik Limited 2 Sheen Road, Richmond, TW9 1AE, UK +44 20 8973 2465 http://www.garlik.com/ Registered in England and Wales 535 7233 VAT # 849 0517 11 Registered office: Thames House, Portsmouth Road, Esher, Surrey, KT10 9AD
Received on Sunday, 7 February 2010 23:25:31 UTC