- From: Dave Beckett <dave.beckett@bristol.ac.uk>
- Date: Mon, 25 Apr 2005 10:36:09 +0100
- To: "Seaborne, Andy" <andy.seaborne@hp.com>
- Cc: 'RDF Data Access Working Group' <public-rdf-dawg@w3.org>
On Thu, 21 Apr 2005 21:03:28 +0100, "Seaborne, Andy" <andy.seaborne@hp.com> wrote: > Dave Beckett wrote: > > Question: Is the WHERE {...} structure optional in sparql? > > > > The grammar says yes and lookin in the WD I can see it's given as an > > example with ASK, > > > > So whereas CONSTRUCT, DESCRIBE and SELECT are all given examples > > requiring WHERE { .... }, ASK has the format ASK { ...} and no WHERE. > > Possibly ASK WHERE { ... } would be more consistent. > > [1] Query ::= Prolog > ( SelectClause | ConstructClause | > DescribeClause | AskClause ) > DatasetClause? > WhereClause? > OrderClause? > LimitClause? > OffsetClause? > > so the whole clause is optional and not related to which kind of query it is. Not the whole clause, as the ( ... ) bit is required. I've called it ReportFormat in my yacc grammar after some earlier SPARQL draft grammar, as I needed to rewrite it anyway to remove the multiple grammar clauses in your grammar. > e.g. DESCRIBE <uri> > CONSTRUCT { :a :b :c } > > and also: > > [13] WhereClause ::= 'where'? GraphPattern > > so the WHERE keyword is optional. !!! This is very odd to me. I am only going to ever teach that WHERE is required as it is a oddity to the language style of KEYWORD {block} everywhere else. Just because something can be omitted without ambiguity, it doesn't need to be allowed. Are you going to allow BY to be omitted from ORDER BY ? :) > These are both legal. > > SELECT * WHERE { ?x ?y ?z } > SELECT * { ?x ?y ?z } Abutting of punctiation terms '*' and {' should be avoided in my opinion, except where needed (turtle ;, etc. do need this). Something that looks like an arithmetic operator '*' is particular tricky also and prevents quick reading and understanding of queries. > > We could have different rules for presence/absence for each query type but at > the moment it is symmetrical. > > > > > So thinking further, what does WHERE with an empty graph pattern {} > > mean? I discussed this with EricP in Italy and we think it's the > > same as query succeding and returning 1 result, and it's what Algae2 > > does. > > Yes - it's a graph pattern that matches any graph. Is this written down somewhere in the WD? More clearly it needs to say it returns 1 match only for any graph, not returns infinite matches of any graph. > > > > > Going through the query verbs: > > > > 1. SELECT * WHERE {} > > returns 1 result[row] with no bindings > > > > 2. CONSTRUCT { :a :b :c } WHERE {} > > returns the graph { :a :b :c} > > > > 3. ASK {} > > returns true > > > > 4. DESCRIBE <uri> WHERE {} > > Well nobody can tell what it returns :) > > but it's probably the same as DESCRIBE <uri> for all cases. > > > > and if WHERE {} is the same as omitting it, then the queries below > > return the same results as the above: > > > > 1a. SELECT * > > 2a. CONSTRUCT { :a :b :c } > > 3a. ASK > > 4a. DESCRIBE <uri> > > -- this one's already in the spec So the tests I gave were all correct? Dave
Received on Monday, 25 April 2005 09:40:09 UTC