- From: Sandro Hawke <sandro@w3.org>
- Date: Fri, 31 Jan 2014 12:15:45 -0500
- To: LDP Patch Discussion List <public-ldp-patch@w3.org>
- CC: Andrei Sambra <andrei@fcns.eu>, Joe <presbrey@MIT.EDU>
Yesterday, Cody got me thinking about PATCH again and I had an idea which I think threads the ldp-patch needle nicely. Cody's LDP implementation is using TurtlePatch [1], which you'll recall is a tiny subset of SPARQL 1.1 Update which is easy to parse and execute in linear time. It has no variables and cannot operate on blank nodes. So, it's great, as long as you have no blank nodes. To me, in recent years, that made it basically useless. But now I see how to make it okay. My idea was that the server could provide a Skolemized (genid) view of the data, suitable for easy patching with TurtlePatch, but not affecting how everyone else interacts with the data. Specifically, I'm thinking that if the client does a GET with "Accept: application/turtlepatch" then it gets a patch from the empty graph to the current graph, with all the blank nodes Skolemized in some way the server will accept for future PATCH operations. You can also think about what it gets as slightly-restricted Turtle with three extra boilerplate lines. For example: GET http://example.org/alice Accept: text/turtle PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX : <http://example.org/> :me foaf:knows [ foaf:name "Bob" ]. GET http://example.org/alice Accept: text/turtlepatch PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX : <http://example.org/> PREFIX genid: <http://example.org/.well-known/genid/d7432/> INSERT DATA { :me foaf:knows genid:517. genid:517 foaf:name "Bob". } The difference here is that text/turtlepatch has the INSERT DATA boilerplate and is Skolemized. (It's also restricted to not have any newlines in string literals, but use \n instead.) The idea is that clients can ask for this Skolemized version, and then patch it easily and efficiently with TurtlePatch. If they're expecting to be patching, I imagine they'll generally fetch with turtlepatch instead of turtle. My sense is this is pretty easy to implement assuming the server (1) has some kind of access to .well-known/genid URI space on its host and (2) has stable internal identifiers for blank nodes which it can expose or efficiently map to/from something it can expose. (There's probably a workaround if (1) isn't true.) What do you think? There are other ways one could ask for a skolemized view, of course. One could have parallel resources, and have Link headers between the two. In practice, it might turn into adding a ?genid=true to the URLs or something. Or one could make a variation of turtle, with media-type text/genid-turtle, or something like that. But it seems to me like a fairly elegant hack to use TurtlePatch for this, since the time in your coding you need these two things is the same. (I note that SPARQL's INSERT DATA syntax does allow blank nodes, as a way to create fresh blank nodes. I suggest they not be used when one is using text/turtlepatch like this, as an RDF serialization syntax.) -- Sandro [1] https://www.w3.org/2001/sw/wiki/TurtlePatch
Received on Friday, 31 January 2014 17:15:47 UTC