- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Mon, 23 Apr 2007 16:10:30 -0700
- To: "Seaborne, Andy" <andy.seaborne@hp.com>
- Cc: Olivier.Corby@sophia.inria.fr, public-rdf-dawg-comments@w3.org
- Message-ID: <20070423231030.GA14194@w3.org>
* Seaborne, Andy <andy.seaborne@hp.com> [2007-04-07 18:36+0100] > > > > Olivier.Corby@sophia.inria.fr wrote: > >Hi, > > > >Here are some comments on current SPARQL WD. > > > >Best regards, > > > >Olivier > > > > Olivier - many thanks for the comprehensive review. > > Responses and corrections done are noted inline. > > Changes made to editors' working draft at: > http://www.w3.org/2001/sw/DataAccess/rq23/rq25.html v1.80 > > One comment remain (11.4.10 RDFterm-equal about use of xsd:dateTime in the > example). I'll defer to Eric on that one. > > >2.3.2 Matching Numeric Types > > > > > >SELECT ?v WHERE { ?v ?p 42 } > >v > ><http://example.org/ns#x> > > > >should be: > > > ><http://example.org/ns#y> > > > > Corrected > > > > > > >2.3.3 Matching Arbitrary Datatypes > > > >The following query has a solution with variable v bound to :y. > > > >should be: bound to :z. > > > > > >SELECT ?v WHERE { ?v ?p > >"abc"^^<http://example.org/datatype#specialDatatype> } > >v > ><http://example.org/ns#y> > > > >should be : > > > ><http://example.org/ns#z> > > > > > > Corrected *2 > > > > > > >2.5 Building RDF Graphs > > > >The SELECT query form returns tabular information. > > > >Could be: > > > >The SELECT query form returns variable bindings. > > > >[[Because we may exploit the results through an API and hence there may be > >no tabular form]]. > > Corrected > > > > >3.3 Other Term Constraints > > > > > >xsd:strings, xsd:booleans and xsd:dateTimes > > > >[[It look strange to add an 's' to the xsd datatype names]] > > reworded as "SPARQL supports types xsd:string, xsd:boolean and xsd:dateTime" > > > > > > > > >4.1.1 Syntax for IRIs > > > >behavoir -> behavior > Done > > > > >prefixedname -> prefixed name > > > Done > > >4.2.3 RDF Collections > > > >[[Suggestion : the (1 ?x 3 4) notation for rdf list could not generate the > >_:b rdf:rest rdf:nil triple; in such a way we could match lists that may > >have more elements.]] > > The syntax of SPARQL triple patterns, and in particular of the syntactic > sugar forms given in section 4.2 ( > http://www.w3.org/TR/rdf-sparql-query/#QSynTriples ), is designed to be > consistent with the syntax of Turtle ( > http://www.dajobe.org/2004/01/turtle/ ). In Turtle, the (1 2 3) syntax > specifies a closed collection (i.e. one terminated by an rdf:nil triple), > and SPARQL adopts this meaning for this bit of syntax. > > You can match a subset of a collection by explicitly including > the component pieces of the collection explicitly: > > _:b0 rdf:first 1 ; > rdf:rest _:b1 . > _:b1 rdf:first ?x ; > rdf:rest _:b2 . > _:b2 rdf:first 3 ; > rdf:rest _:b3 . > _:b3 rdf:first 4 . > > > > > > >5.2.2 Scope of Filters > > > >A constraint, expressed by the keyword FILTER, is a restriction on > >solutions over the whole group in which the filter appears. > > > >[[What happens if a variable in the filter is not bound in the current > >group, but is bound in another group after current group? Does the filter > >fail? ]] > > As per the text you've cited and the algebra given in Section 12, Filters > are evaluated in terms of the solution mappings of the group in which the > filter appears. If a variable in the filter is unbound in a solution > mapping, then as per Section 11.2 any function or operator (except > bound()) on the variable produces a type error. If this propagates to the > top of the filter, then the solution is removed from the multiset of > solution mappings. > > > > > > >7 Matching Alternatives > > > >The UNION pattern combines graph patterns; each alternative possibility > >can contain more one triple pattern: > > > >-> more than one triple pattern: > > Done > > > > >9.1 ORDER BY > > > >Using ORDER BY on a solution sequence for a CONSTRUCT or DESCRIBE query > >has no direct effect because only SELECT returns a sequence of results. > > > >[[ > >This is in contradiction with : > > > >10.2.3 Solution Modifiers and CONSTRUCT > >The solution modifiers of a query affect the results of a CONSTRUCT query. > >In this example, the output graph from the CONSTRUCT template is formed > >from just two of the solutions from graph pattern matching. The query > >outputs a graph with the names of the people with the top two sites, rated > >by hits. > >]] > > The next sentence in 9.1 follows on with the (indirect) effect of ORDER BY > - it has an observable effect only when LIMIT and OFFSET slice the solution > sequence. > > """ > Used in combination with LIMIT and OFFSET, ORDER BY can be used to return > results generated from a different slice of the solution sequence. > """ > > > > >9.3 DISTINCT > > > >What is the solution of : > > > >select distinct ?y where { > > ?x c:friend ?y > >} > > > >on this graph : > > > >ex:Jules c:friend ex:Jimmy > >ex:Jules c:friend ex:James > >ex:Jimmy owl:sameAs ex:James > > SPARQL is defined for simple entailment, with no notion of the semantics > of owl:sameAs. The result of this query is: > > ?y > -------- > ex:Jimmy > ex:James > > The conditions for extending SPARQL to other entailment regimes are given > in: > http://www.w3.org/TR/rdf-sparql-query/#sparqlBGPExtend > > > > >11.3 Operator Mapping > > > >xs:integer, xs:decimal, xs:float, xs:double > > > >should be : > > > >xsd:integer, xsd:decimal, xsd:float, xsd:double > > Corrected - and checked there are no other "xs:" anywhere in the document > > > > >operator = > > > >[[ > >I think there should be an = operator for plain literals because > >otherwise, RDFterm-equal applies, in which case : > > > >11.4.10 RDFterm-equal > > > >RDFterm-equal produces a type error if the arguments are both literal but > >are not the same RDF term. > > > > > >So, following the current draft : > > > >'Jules'@en = 'Jim'@en > > > >produces a type error because they are not the same RDF term. > > > >It is the same with != < <= > >= > >]] > > By design, SPARQL does not define semantics for comparing plain literals > with language tags, as you've noted. Note that query writers can compare > literals themselves: > > langMatches(lang(?a), lang(?b)) && > langMatches(lang(?b), lang(?a)) && > (str(?a) = str(?b)) > > The Working Group has not been motivated in the past to define the > comparison operators on plain literals with language tags. > > Section 11.3.1 "Operator Extensibility" licenses SPARQL language extensions > that add rows to the operator table, such that implementations may support > comparing plain literals with language tags. > > I hope that this addresses this concern; please let us know if not, and > the Working Group will weigh changes to the operator table versus the > schedule risks of publishing a new Last Call draft. > > > > >SPARQL Tests, defined in section 11.4 > > > >[[regex could operate on xsd:string as well as simple literal.]] > > Similarly, an implementation can add regex working on xsd:strings because > it is a type error and can be enhanced. > > > > >11.4.7 datatype > > > >if the the parameter -> if the parameter > > Done > > >11.4.10 RDFterm-equal > > > > > > * term1 and term2 are equivalent IRIs as defined in 6.4 RDF URI > >References. > > * term1 and term2 are equivalent literals as defined in 6.5.1 Literal > >Equality. > > * term1 and term2 are the same blank node as described in 6.6 Blank > >Nodes. > > > > > > > >[[There are no such 6.4, 6.5.1 and 6.6 sections in the current document, > >so the wording looks strange (in particular when you print the document)]] > > Agreed - I've added: "of [CONCEPTS]" to stress the remote link: > e.g. > > * term1 and term2 are equivalent IRIs as defined > in 6.4 RDF URI References of [CONCEPTS]. > * term1 and term2 are equivalent literals as defined > in 6.5.1 Literal Equality of [CONCEPTS]. > * term1 and term2 are the same blank node as described > in 6.6 Blank Nodes of [CONCEPTS]. > > > > > > >[[I think that the 2nd example of RDFterm-equal on dateTime is not > >appropriate here because in this case, the = operator on dateTime applies > >and hence not RDFterm-equal()]] > > > > I defer to Eric on this point. Yeah, that was from an earlier day. How about this? Data: [] foaf:name "Alice" ; foaf:schoolpage <http://school.example/> . [] foaf:name "Bob" ; foaf:schoolpage <http://school.example/> . Query: SELECT ?name WHERE { ?b foaf:name "Bob" . ?b foaf:schoolpage ?schpg . ?schoolmate foaf:schoolpage ?schpg ?schoolmate foaf:name ?name FILTER (?b != ?schoolmate) } Results: ?name "Alice" > > > >12.1.5 Basic Graph Patterns > > > > > >A Basic Graph Pattern is a set of Triple Patterns. > > > >[[SPARQL parsers are required to remove duplicate triples?]] > > They are not required to remove duplicates. > 1/ {a a} is the same set as {a}, just not canonical. > 2/ Solving for a bag would yield the same answers. > > > > >12.2.1 Converting Graph Patterns > > > > > > > >If the element consists of multiple GroupGraphPatterns then connected with > >'UNION' terminals, then replace with a sequence of nested union operators: > > > >-> > > > > GroupGraphPatterns connected with 'UNION' terminals [[remove then]] > > Done > > > > >12.2.2 Examples of Mapped Graph Patterns > > > > > >Example: group consisting of a basic graph pattern, a filter and an > >optional graph pattern: > > > >{ ?s :p1 ?v1} FILTER (?v1 < 3 ) OPTIONAL {?s :p3 ?v3} } > >Filter( ?v1 < 3 , > > LeftJoin( BGP(?s :p1 ?v1), BGP(?s :p2 ?v2), true) , > > ) > > > > > >should be [[replacing 2 by 3]]: > > > > > >{ ?s :p1 ?v1} FILTER (?v1 < 3 ) OPTIONAL {?s :p3 ?v3} } > >Filter( ?v1 < 3 , > > LeftJoin( BGP(?s :p1 ?v1), BGP(?s :p3 ?v3), true) , > > ) > > > > Fixed by replacing 3 by 2 in the input. > > { ?s :p1 ?v1} FILTER (?v1 < 3 ) OPTIONAL {?s :p2 ?v2} } > > Filter( ?v1 < 3 , > LeftJoin( BGP(?s :p1 ?v1), BGP(?s :p2 ?v2), true) , > ) > > > > > > > > >12.2.3 Converting Solution Modifiers > > > > > >M := OrderBy(M, list of of order comparators) > > > >-> > > > >list of order > > Done > > > > >12.3.2 Treatment of Blank Nodes > > > > > >Since SPARQL treats blank node IDs in the answer document as scoped to the > >document ... > > > >[[There may be no answer document when the result is accessed through an > >API, so this reference to answer document looks strange.]] > > We need a name for the whole answer, whether variables bindings or graph. > SPARQL defines the query language and the protocol, and the protocol > returns documents - APIs are not directly considered in the spec. The API > is accessing the (probably notional) answer document. APIs are not > required to do anything particular but it would seem natural if they > behaved the same whether accessing a local query implementation or > deserialized results from a remote query service. > > > > >12.4 SPARQL Algebra > > > > > >Definition: Filter > > > >has a effective boolean -> has an effective boolean > > > >Definition: Diff > > > >{ μ | μ in Ω1 such that for all μ′ in Ω2, > >μ and μ′ are not compatible } > >set-union > >{ μ | μ in Ω1 such that for all μ′ in Ω2, > >μ and μ' are compatible and expr(merge(μ, μ')) is > >false } > > > > > >[[ > >I think the second member of union should be : > > > >{ μ | μ in Ω1 such that for all μ′ in Ω2, > >μ and μ' are compatible => expr(merge(μ, μ')) is > >false} > > You suggest replacing "and" by "=>" > > It should be "and" - both parts must be true. It's not a logical > implication inside the conditon. > > > > >in addition it could be said that: expr(..) is false or returns an error > > Changed to > expr(...) has an effective boolean value of false which covers the error > case. > > >]] > > > >Definition: LeftJoin > > > > > > { merge(μ1, μ2) | μ1 in Ω1 and μ2 in Ω2, > >and μ1 and μ2 are compatible and expr(merge(μ1, > >μ2)) is true } > >set-union > > { μ1 | μ1 in Ω1 and μ2 in Ω2, and μ1 and > >μ2 are not compatible } > >set-union > > { μ1 | μ1 in Ω1 and μ2 in Ω2, and μ1 and > >μ2 are compatible and expr(merge(μ1, μ2)) is false } > > > > > > > >[[ > >I think member 2 and 3 of union should be : > > > > { ... } > >set-union > > { μ1 | μ1 in Ω1 such that for all μ2 in Ω2, > >μ1 and μ2 are not compatible } > >set-union > > { μ1 | μ1 in Ω1 such that for all μ2 in Ω2, > >μ1 and μ2 are compatible => expr(merge(μ1, μ2)) is > >false or returns an error} > > > >]] > > > > As above. > > > >12.5 Evaluation Semantics > > > > > > > >Definition: Evaluation of Join(P1, P2, F) > > > >eval(D(G), Join(P1, P2)) = Join(eval(D(G), P1), eval(D(G), P2)) > >eval(D(G), Join(P1, P2), F) = Filter(F, Join( eval(D(G), P1), eval(D(G), > >P2) ) ) > > > > > >[[ > >I think there should be one rule for Join(P1, P2) without F, and one rule > >for Filter(F, P) > >]] > > corrected as suggested - that was a previous style of having joins to be > like LeftJoin. > > > > > > > > > > > > > >Definition: Evaluation of LeftJoin(P1, P2) > > > >should be: > > > >Definition: Evaluation of LeftJoin(P1, P2, F) > > Corrected > > > > >Definition: Evaluation of a Graph Patten > > > > > >eval(D(G), Graph(IRI,P)) = eval(D(D[i]), P) > > > >should be [[replacing i by IRI]]: > > > >eval(D(G), Graph(IRI,P)) = eval(D(D[IRI]), P) > > > > Corrected > > > > > > > > >12.6 Extending SPARQL Basic Graph Matching > > > > > >mappijng -> mapping > > Corrected If you are content with this response, please reply, prefixing your Subject: with [DONE]. (This is for our issue tracking system.) Of course, if you are not satisfied, reply so we can resolve the remaining issues. -- -eric office: +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA mobile: +1.617.599.3509 (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Monday, 23 April 2007 23:58:16 UTC