Where we propose an initial criterion to answering the question this thread is 
asking:
"How to name things with URIs".


>> [snip]
>> On 15 May 2011, at 12:11, Reto Bachmann-Gmuer wrote:
>>> Henry Story Wrote:
>>>> [snip]
>>>> But here is a quick question: why not simply make the ProxyTcProvider a 
>>>> higher priority than the pure local one?
>>> We wouldn't know when to try to dereference a graph and when not.
>> 
>> Any Resource that is not local, that can be dereferenced (http, https, ftp, 
>> ftps,...) (that is not on some blacklist) can be dereferenced.
>> 
>> Any resources that are local (localhost domain, or the name of the current 
>> machine
>> is running on) should be passed to the next TcProvider.
> We don't know the names of the current machine, remember that we are
> operating on the rdf access layer (SCB) here. Unlike the WebId service
> this is not on the platform service.

Well perhaps it is at the wrong layer then. Perhaps a WebProxy, being at the 
web layer needs to know the name of the service it is running as. Please read 
through the following  reasoning carefully before replying.

Consider that the API you are developing has the following method

     def getGraph(name: UriRef)

If the WebProxy services is called like this:

wp.getGraph("https://bblfish.net/user/admin/".uri)

Then it certainly would be very useful for the proxy service to know that 
bblfish.net is the local machine, and that it does not need to do an httpS GET 
to discover the graph. 

A use case can help illustrate this. Imagine a zz service looks at a foaf file 
that contains a reference to <https://bblfish.net/user/admin/#me> It sends the 
request to the cache proxy to fetch the file so that it can find out more about 
that resource. What is it? A fish, a mineral, a human, or an ontology?  So it 
goes to the web proxy and calls it above. If your proxy looks in its
  
    urn:x-localinstance:/cache/

namespace it won't find a reference to our URL above. So it will do a GET on 
the web, find it,
and place it in 

    urn:x-localinstance:/cache/https://bblfish.net/user/admin/


Now imagine I then update my bblfish.net profile. The next time my zz instance 
will go and look in the proxy it will find the above urn and look up the 
information there. Not only will we now have the information twice in the 
database, we will end up getting out of date information for our own data!

   So interestingly this suggests that local data be placed in the store, in a 
graph that corresponds to the name of the graph at which people from across the 
web would fetch it at. Because then one won't need to do any special conversion 
when searching for data that is local. (Ie: public data about me should be 
placed in a graph named https://bblfish.net/user/admin/ )

   OR  BETTER: all local data should be stored in the local store with 
*relative* URIs - of which your urn:x-localinstance is a hack to work with 
triple stores that don't come with relative URI support - and these *relative* 
uris should when transformed to global URIs be the URIs of what an external 
user would GET when making a request on that graph. Ie: my local public profile 
should be in the graph 
    
   /user/admin 

which is internally written out as

   urn:x-localinstance:/user/admin

   This gives us a simple but very powerful criteria to test URIs - which is 
what this thread is about: "How to name things with URIs". 
  
   - local graphs should be named by how they are accessible remotely (even if 
they only use relative URIs)
   - remote cache graphs - ie graphs that pretend to only store what is said 
remotely - should (when public) store the data at the graph of the remote URL.

   Now: this is where your view and mine can converge. If the local Clerezza 
triple store republishes remote URLs, then those will have to be placed in the 
store at a local, relative
URL, eg urn:x-localinstance:/cache, because at this point people will be able 
to point to the publishing zz instance to make the claims made by the remote 
graph.

   Though instead of doing that I would rather suggest using the HTTP Proxy 
mechanisms, and develop a Proxy  layer for each zz instance, as I think that 
avoids taking responsibility - other than the responsibility of being a good 
proxy - for what others say. (see slide 37 of my presentation "Philosophy and 
the Social Web" 
http://www.slideshare.net/bblfish/philosophy-and-the-social-web-5583083 )

   NEVERTHELESS it is then still true that the WebProxy needs to know the URIs 
of the local machine if it is going to function correctly, since it needs to 
know when it does not need to make an HTTP connection but can either look at 
the graph directly or make a request to the correct jax-rs method


Reply via email to