- From: Richard Newman <rnewman@twinql.com>
- Date: Fri, 8 Jan 2010 16:32:52 -0800
- To: public-rdf-dawg-comments@w3.org
Hi folks, A few questions/comments on the Update portion of the 1.1 draft: * DELETE/MODIFY/INSERT are described in terms of CONSTRUCT templates. CONSTRUCT templates allow blank nodes, which are generated as fresh blank nodes for each input row. This makes sense for INSERT, but it doesn't make sense for DELETE: the fresh blank node will never match a triple in the store, than thus DELETE { ?s ?p [] } WHERE { ?s ?p ?o } is a no-op by definition. It would be good for this issue to be addressed in the spec, with one of the following possible resolutions: 1. Forbid blank nodes in a DELETE template. 2. Define those blank nodes as being null placeholders, such that DELETE { ?s _:x _:y } WHERE { ?s rdf:type rdfs:Class } would delete every triple whose subject is an rdfs:Class. 3. Document that DELETE triple patterns containing blank nodes will never match. * INSERT et al permit multiple "INTO" URIs: INSERT [ INTO <uri> ]* { template } [ WHERE { pattern } ] but the text discusses the graph in the singular ("The graph URI, if present, must be a valid named graph..."). Is it intended that '*' actually be '?'? If not, the text should be changed, and text added to describe how an implementation should process multiple graphs: e.g., should they run DELETE then INSERT on each graph in turn, or should all DELETEs be batched together prior to the INSERTs? * Re atomicity: it would seem that, for systems which will allow multiple SPARQL/Update requests within a single transaction, the requirement that "Each request should be treated atomically by a SPARQL-Update service" is onerous. I don't know of too many systems that support sub-transactions, and thus implementations will be forced to take one of two routes: 1. Violating the spec: "sorry pal, that doesn't apply: our transactions have multi-request scope" 2. Annoying users: "sorry pal, we aborted your transaction because SPARQL 1.1 says we have to, even though you wanted to handle it yourself". Neither choice is beneficial to users (the former because it reduces their ability to rely on the spec). I'd suggest changing the language to require that implementations provide "some method of atomically executing the entire contents of a SPARQL/Update request", which allows for the execution of a request within an existing transaction, as well as for approaches that execute requests within their own new transaction. * There doesn't seem to be any mention at all of responses in the draft. Is that intentional? * Re LOAD: if we can have CREATE SILENT, how about LOAD SILENT, which doesn't fail (and abort your transaction!) if the LOAD fails? * I'd like to throw my 2¢ in for Issue 20. It strikes me as a little short-sighted to assume that every store operates with first-class graph objects, such that they can be created and deleted in a closed-world fashion: not only does this conflict with some implementations (e.g., those which use quad stores to efficiently implement named graphs, and those which dynamically load data from a graph on an ad hoc basis), but it also is dissonant with the "triple stores are caches of the semantic web" open-world view. I see in emails text like "We have agreed on the need to support a graph that exists and is empty"[1]. I would like to see strong supporting evidence for this in the spec (or some other persistent and accessible place) before resolving this issue. I personally don't see any need to distinguish an empty graph (after all, it's easy to add an all-bnodes triple to it to make it non-empty but without excess meaning). I note that there is no proposal for CREATE SUBJECT (or PREDICATE or OBJECT), nor CREATE LANGTAG. I see little point in unnecessarily special-casing one value space to reduce its dynamism. From interactions with users, I expect that "oh, you mean I have to CREATE a graph before I can use it in an INSERT query?" will be a common question, and "always preface your query with CREATE SILENT..." the pervasive response. Seems like a waste of time to me. (Regardless of the official outcome of the issue, my implementation is unlikely to strictly follow the CREATE/DROP behavior, because it would be inefficient to track graphs for the sole purpose of throwing errors in edge cases. CREATE will be a no-op, and DROP will be identical to CLEAR.) Thanks for your time. -Richard Newman [1] <http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JanMar/0070.html >
Received on Saturday, 9 January 2010 00:33:22 UTC