- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Wed, 23 Feb 2005 18:22:29 +0000
- To: Bob MacGregor <bmacgregor@siderean.com>
- Cc: public-rdf-dawg-comments@w3.org
Bob MacGregor wrote: > Andy, > > Seaborne, Andy wrote: > >> Bob MacGregor wrote: >> >>> The WITH and FROM constructs embody some unfortunate choices. >>> >>> Background graphs represent the most common case, while named >>> graphs are going to see less use. The FROM keyword in SQL will >>> seem most familiar to programmers, and its natural that it would >>> refer to background graphs. The current language spec reverses this >>> commonsense idea, teaming the less used keyword WITH with the >>> more used type of graphs. >> >> >> The working group has had a long debate about these keywords - in a >> strawpoll, >> people found it marginally clearer if FROM kept the name and WITH >> didn't. I >> agree that it can confuse and better suggestions are welcome. > > I think this provides good evidence that having both forms is a > mistake. Given > that only one of them (WITH) is essential, the other should be dropped. > >>> Suppose an unsuspecting programmer writes the following >>> >>> SELECT ?a >>> FROM my:g >>> WHERE (?a my:foo my:b) >>> >>> The FROM clause will either be ignored or an error message might >>> be thrown, but its not going to give the "expected" results. >>> Substituting >>> WITH for FROM fixes the problem, but it would be much better >>> if we didn't design a propensity for human error right into the >>> language. >>> >>> The FROM clause inherently defines a disjunction (the poorly- >>> named UNION construct). However, by masking the fact that >>> it defines a disjunction, it also masks a lack of generality. Consider >>> the following query, which either is legal or should be (modulo my >>> ignorance of SPARQL syntax): >>> >>> SELECT ... >>> WHERE >>> Graph ?g1 {...} >>> Graph ?g2 {...} >>> AND >>> {{?g1 = my:a} UNION {?g1 = my:b} >>> AND >>> {{?g2 = my:c} UNION {?g2 = my:d}} >>> >>> This query is not expressible using the FROM clause. This example shows >>> that the FROM clause is superfluous (or should be), and non-general. >> >> >> >> I'm not complete clear as to what RDF dataset your trying to build >> here - could >> you describe it some more? What is the "="? assignment, equality test or >> owl:sameAs (N3 style). > > Of course I mean mathematical equality (e.g., the KIF equality operator). > I take it for granted that any reasonable > statement-based logic language would include it. Apparently, SPARQL > does not, > and instead introduces bizareness like distinguishing WITH and FROM. > The current > language appears to be very liberal in introducing specialized > operators, and leery > of introducing generic, broadly applicable ones. > >> >> Is it trying to form the RDF merge of two graphs into new, named >> one? If so, >> than the expectation is that union is formed outside the query >> environment (c.f. >> creating the inference closure of a graph). > > If SPARQL had a clear semantics, then the meaning of a language form > would be > pretty much self-evident, independent of the various use cases. > Instead, statement-like > notions (e.g., conjunction) are being mixed up with set-like notions > (UNION). > > The quad-like SOURCE operator that SPARQL had a while back had a > well-defined > interaction with the rest of the language. If the GRAPH operator is > just a semantic > variant, then it would also have a well-defined interaction, e.g., > > Graph ?g {(?a p1 ?b) (?c p2 ?d)} > > would be equivalent to > > {Graph ?g (?a p1 ?b)} AND > {Graph ?g (?c p2 ?d) } I believe that: GRAPH ?g {(?a p1 ?b) (?c p2 ?d)} generates the same solutions as GRAPH ?g (?a p1 ?b) GRAPH ?g (?c p2 ?d) > > However, I can imagine that these two statements are not equivalent > (and the might not > be legal SPARQL, but should be). The SPARQL language is becoming > increasingly less > comprehensible. Adding more use cases isn't going to fix it. > Streamlining the syntax is. Confusion over "use case" then - a use case isn't an example query - it's an example task the user wishes to peform. See: http://www.w3.org/TR/rdf-dawg-uc/ > >> The WITH/FROM combination isn't the only way to assign a dataset to a >> query - >> indeed, I don't expect it to be the usual way for systems of any size >> where I >> expect the dataset to be passed to the query engine >> >> We did discuss the fact that association of the dataset to the query >> execution >> is a protocol issue, but sometimes there is no "protocol" to peform >> this (e.g. >> local query). This will work out as we publish the protocol. >> >> WITH/FORM are most useful in small scale use (including the testing) >> where creation of graphs just for the life of the query is not an >> undue burden. >> >> See also: >> http://lists.w3.org/Archives/Public/public-rdf-dawg/2005JanMar/0070.html >> for some examples of datasets >> >>> >>> Best would be to eliminate it entirely, and rename "WITH' to 'FROM'. >>> >>> If you really want convenience, which is what FROM seems to be all >>> about, try adding an 'IN' operator, e.g., something like >>> >>> ?g1 IN {my:a, my:b} >>> AND >>> ?g2 IN {my:c, my:dJ} >> >> >> Could you explain that example a bit further? I find myself guessing >> as to it >> meaning but I think it is creating the RDF merge of my:a and my:b and >> assigning >> it to ?g1 (etc). What name does it get? Some system defined out? > > SQL defines the "IN" operator -- its equivalent to > > {?g1 = my:a} OR {?g2 = my:b} > > But then, SPARQL doesn't have equality. The SPARQL operations are in sec 11 - they include equality. > Defining a language has the > side-effect > of circumscribing what you can and can't imagine. The current SPARQL is > overly circumscribed, which makes it hard to imagine better alternatives > while > still expressing examples in SPARQL. That is > why I recommend looking at SQL -- it is very well defined, very > expressive, and > allows one to easily express things (such as examples I've thrown in > above). I > can correctly interpret all of the the normal SQL expressions without having > to build little database models. > >> >> If the query says: "SELECT ?g1" what gets returned for ?g1 ? >> > I assume/hope the expansion using "OR' and '=" answers your question. Sort of - the use of UNION (which in SPARQL combines graph patterns) and "=" (value equality) was confusing me. Andy > >>> >>> Cheers, Bob >>> >>> >> Thanks for the comments >> Andy >> > > -- > > Bob MacGregor > Chief Scientist > > > Siderean Software Inc > 390 North Sepulveda Blvd., Suite 2070 > <http://maps.yahoo.com/py/maps.py?Pyt=Tmap&addr=5155+Rosecrans+Ave&csz=Hawthorne%2C+Ca+90250&country=us> > El Segundo, CA 90245 > bmacgregor@siderean.com <mailto:bmacgregor@siderean.com> > tel: +1-310 647-4266 > fax: +1-310-647-3470 > > > > > > > > >
Received on Wednesday, 23 February 2005 18:22:51 UTC