- From: Benja Fallenstein <benja.fallenstein@gmail.com>
- Date: Mon, 14 Mar 2005 18:22:03 +0100
- To: Danny Ayers <danny.ayers@gmail.com>
- Cc: semantic-web@w3.org
Hi Danny,
(disclaimer: the post below is a bit rambling about half-cooked ideas)
On Mon, 14 Mar 2005 16:35:54 +0100, Danny Ayers <danny.ayers@gmail.com> wrote:
> Your approach to syntax make sense, and this is definitely worthwhile
> work. I'm not sure it's worth putting much weight on legibility of the
> URI strings, as the encoding make them pretty unreadable whatever you
> do.
True, but IMHO there is still a big difference between "readable if
you concentrate" and "almost unreadable even if you concentrate." I
can read the syntaxes I've been toying with pretty quickly myself, if
I concentrate. OTOH, I've had some feedback that others still find
them almost completely unreadable, so not sure how much it's worth.
I think the difference is big because anything that makes it easier to
play with the interface is good -- being able to put a query string in
your browser and experimenting with variations = good. Although--
> But being a short step away from readability (using XSLT
> formatting where XML data is available, or more simply code*).
Hmm, one thing I hadn't considered, though, is that modern browsers
will do %-encoding for you in the URI bar. Perhaps I've been barking
up the wrong tree -- putting Turtle in my browser bar still seems like
the simplest thing, and definitely more readable!
> What I
> don't get from your examples is the intended behaviour of the service
> (for GET and POST). In other words, if you're doing a GET and passing
> a bunch of statements, what are you asking the server for? 
I was thinking about GET and PUT; for POST, we don't need to encode
stuff in the URI, obviously.
I've actually slightly changed my mind after furiously thinking about
this during the weekend; I think encoding a SPARQL request in the URI
may be more useful, if we can find implementation techniques that make
it easy to implement for web services (more notes on what I mean here
below).
Before that, I was thinking of this as a replacement for the
application/x-www-form-urlencoded query string. Look at a query string
like
    ?q=Danny+Ayers&ie=UTF-8&oe=UTF-8
It seemed to me that what is going on in most query string is that we
give properties of some resource -- namely, the resource identified by
the whole URI that the query string is part of. I.e., what the above
says is,
    @prefix s: <http://google.com/search??q=Danny+Ayers&ie=UTF-8&oe=UTF-8>
    s:    google:q     "Danny Ayers".
    s:    google:ie    "UTF-8".
    s:    google:oe   "UTF-8".
So what we have here is a non-extensible description of the resource
we want a representation of. My idea with URI-Triples was to make this
description extensible.
As I said, though, I think that a SPARQL gateway is probably the
better problem. And probably just %-encoding it is the right thing,
considering that browsers do accept it... I just put this in
Konqueror's location bar:
http://example.net/?CONSTRUCT * WHERE (?x foaf:mbox <mailto@example.org>)
and Konqueror went here:
http://example.net/?CONSTRUCT%20*%20WHERE%20(?x%20foaf:mbox%20<mailto:foo@example.org>)
(Uh-oh, looks like it's buggy -- it didn't escape <> -- but whatever.)
I was originally looking for something that can do "I want some
reasonable information about this resource, e.g. a CBD if you think
that's reasonable" -- but then I found that SPARQL has DESCRIBE, so
nothing special needed there :-)
I said above that I see an implementation problem. What I'm worried
about is services that generate data on-the-fly, with a mapping
between data and triples that isn't entirely trivial. Here's an
extreme example to make the point. Consider a service which, when
GETting this URI:
    http://example.org/hashers/sha1?str=foo+bar+baz
returns this graph:
    _:a    hash:input    "foo bar baz".
    _:a    hash:fn       hash:SHA1.
    _:a    hash:output   "c7567e8b39e2428e38bf9c9226ac68de4c67dc39".
And now consider this SPARQL query:
    SELECT ?a WHERE ( ?x hash:input ?a ) ( ?x hash:fn hash:SHA1 )
        ( ?x hash:output "c7567e8b39e2428e38bf9c9226ac68de4c67dc39" )
Obviously, the service can't "solve" this query. Now not all services
may be such hard cases, but the basic pattern -- with a limited set of
queries -- may not be so unusual. Consider a service on the desktop,
where it's fast and quick to give the size of a specified file, but
you would need to go through the whole harddrive to get the one file
with size 9012384. The implementor would want to implement the
function "given a file, return its characteristics"; can we layer a
SPARQL query service on top of that in a reasonable fashion?
> (aside -
> might the common 256 character limit on GETs be a problem?).
Absolutely.
However, I think that's inherent in the problem -- we just need to
screw it. GET with a body in the request would be a bigger change (and
a spec change too, while the URI spec allows for arbitrary-size URIs).
Of course we *could* use POST, but then we throw away the benefits
from GET.
And when we nest URIs in URIs -- as we have to, in RDF-related
requests -- we'll get long URIs, whatever we do.
We could alleviate the problem, though, by providing default
namespaces on the server side -- i.e., the server would implicitly set
some namespace prefixes if the client doesn't set them explicitly.
E.g. above, I assumed that foaf: was set implicitly.
> There are a few RDF APIs around (e.g. Joseki's WebAPI), and the SPARQL
> Protocol looks like it'll be very useful. But there doesn't seem to be
> much cohesion between the approaches, still nothing you could call The
> RDF Protocol. Ok, it's probably a situation where standards based on
> implemented ad hoc specs might be preferable to up-front WG
> recommendation. But maybe it's time for the DAWG to pick this up and
> do some combination of the various approaches and a little unnatural
> selection.
Hmm, I had a quick look at Joseki, and it sounds to me like obvious
HTTP + the SPARQL protocol does most of this.
Getting a whole graph is HTTP GET; not much to think about there.
Query is the SPARQL protocol, using SPARQL as the query language.
Update, well -- actually I think update should be handled like get and
query, using HTTP PUT. So, if you want to change the volume of
my:speaker to 20, you do this:
    PUT http://example.org/?query=CONSTRUCT%20*%20WHERE%20(my:speaker%20snd:volume%20?x)
    Content-Type: application/x-turtle
    @prefix...
    my:speaker snd:volume "20".
I.e., you use the URI to specify which part of the graph you want to
change, and PUT the triples representing the new state there...
> *
> class URIEncoder:
...
Unfortunately, it doesn't work because {} doesn't guarantee iteration
order (so you might first escape " " to "%20" and then "%" to "%25"),
and because for decoding, escapes may be lower-case. But it's close
:-)
- Benja
Received on Monday, 14 March 2005 17:22:35 UTC