- From: Nathan <nathan@webr3.org>
- Date: Wed, 02 Feb 2011 01:23:57 +0000
- To: AWWSW TF <public-awwsw@w3.org>
- CC: Jonathan Rees <jar@creativecommons.org>, Tim Berners-Lee <timbl@w3.org>
Guys, We've been modelling it all wrong (well I certainly have) - here goes, do follow: <u> a :Resource . [] a :Representation . ... When a relation is present in an HTTP header (Link) or in a representation ( <link href="<y>" rel="stylesheet"> in text/html ) then it is always associated with nothing /to start with/. That is to say, all you know is { ? <foo> <y> } and you have to determine what ? is, the normal way of doing this is by looking at the domain of <foo>. Some relations have a domain of :Representation, examples of this include: stylesheet alternate author help icon Where we've been going wrong previously, is by saying things like: <u> a :InformationResource ; stylesheet <y> . When in fact it's: [] a :Representation ; stylesheet <y> . We know nothing about <u> other than what we can conclude by looking at information about <u>, for example looking at our representation and concluding that <u> names a [whatever]. The representation doesn't have a name (it was just pulled from a message of some kind). Each representation is in it's own namespace, the closest thing I can describe it as, is a graph literal / quoted graph in n3. Each representation is a description. Each element within a representation is identified by a locally scoped existentially qualified variable, a blank node, (referenced non persistently within the scope of that representation). { [] a :Link ; href <y> ; rel <stylesheet> . } a :Representation . that'd be the following html: <link href="<y>" rel="stylesheet"> The link is described within the html, within the representation, and as you can plainly see the subject is missing, it has to be inferred when creating the link from it's description. The only way to infer the subject is to understand the description, the rel, the domain of the rel, in stylesheet's case it has a domain of :Representation, hence its a relation between the representation and the stylesheet. In another case, the rel 'help': { _:b0 a :P ; :child _:b1 . _:b1 a :Label ; :child _:b2, _:b3 . _:b2 a :Input ; name "topic" ; nextSibling _:b3 . _:b3 a :A ; href <h.html> ; rel <help> ; text "(Help)". } a :Representation . in html: <p><label> Topic: <input name=topic> <a href="h.html" rel="help">(Help)</a></label></p> The description of the 'help' relation: "For a and area elements, the help keyword indicates that the referenced document provides further help information for the parent of the element defining the hyperlink, and its children." So the above describes (among other things) a link between the locally / representation scoped P element and <h.html> (relative-uri resolved against the base). That gives us another class of things, those which a representation comprises, elements in html for example. Again, these are not named with uris. Each element within a representation can be optionally given a locally scoped identifier. { [] a Paragraph ; content "bar baz" ; id "foo" } a :Representation . that'd be the following html: <p id="foo">bar baz</p> the @id "foo" is locally scoped to the representation, within one context (presentation) it refers to the presentation of the thing described, within another (js) it refers to the memory resident dom node which was created as described. Note, in both cases it refers to the thing described, it's just being referred to for different purposes. Remember "thing" in this case is constrained to those things like html elements, the nodes in the description of the representation. @id's can be referenced by the fragment part of a URI, however it's very important to note that this doesn't mean that <u#foo> is a name for the element within the representation, rather, and only within the context of dereferencing, the two components are separated, in to <u> and <#foo>, <u> is dereferenced to get a representation (more about this later), and <#foo> is used to refer to the element with the @id "foo" within the representation/description (if it exists in there). As noted earlier, how that <#foo> reference is actioned depends on the context in which the representation is being considered, but within that scope it always refers to the same thing, the thing described as having an id of "foo". Outwith the scope of dereferencing, the uri <u#foo> is a (fully qualified?) global name in it's own right, distinct from any other, and can be used to name any resource. This illustrates the duality of URIs: name <u#foo> != dereference( <u> <foo> ) you can probably find a much better way to write that! but essentially a uri w/ a fragment is very different to an @id reference within an unnamed representation. So, representations are anonymous, the elements within are locally scoped to that representation for identification purposes, being bnodes, or bnodes with an @id. That still leaves us with Resources, and there's still another level of duality to go. A URI <u> is a name for a resource, when you dereference that name, then depending on how you are dereferencing it, the <u> is split in to it's component parts, and each part is resolved individually in order to locate some process on a machine (local or over the network), a request in then sent a response is received, sometimes containing a representation. Now, the URI <u> in the scope of dereferencing, is a compound identifier, where each component refers to something (a scheme, another name (domain/ip), a name for a process on a (virtual) machine and so forth), those component parts are often augmented with additional information (such as message structure) and sometimes the full URI <u> is simply is placed in a string (like a query string) to do the dereferencing. The actual "process" or "resource" a request is sent to when dereferencing is identified by the sum of all the components and messages, it's often the case that this process is unidentifiable. Some authority and provenance information can be given in the messages, to have some kind of grasp on who, or which machine, is responsible for replying to a request, but as for the "resource" or "process" it's typically just some short lived worker process on a machine that's killed as soon as the response is done. Networking people, programmers, REST fans all use the term "resource" to refer to the abstract concept of one of these accessible processes, and they use a URI <u> to refer to that process within the bounds of dereferencing, indeed they normally refer to one of more of the component parts, and when they say "http://ex.org/foo/bar?x=y" they mean ( "http" "ex.org" "/foo/bar" "x=y" ), not <http://ex.org/foo/bar?x=y>. This gives us a fourth class of thing, a "NetworkResource" (for lack of a better term, many think of IRs as these class of things) - luckily NetworkResources can easily be disambiguated. For example Location: "u" refers to a NetworkResource, it is within the scope of dereferencing, likewise all protocol usage. As with representations, NetworkResources are not named, it's not: <u> a NetworkResource . but rather: [] a NetworkResource ; address "u" . To summarize where this leaves us at the minute, we have four classes of things: - Resource (can be named with a URI) - NetworkResource (always unnamed) - Representation (always unnamed) - RepresentationElement (always unnamed) By simply applying this constraint to the web, and setting the correct domain on each relation which requires it, we can disambiguate everything that causes any confusion. From there it's just a simple case of giving different things different names. Rather amazingly, I also find this to be consistent with web architecture, with what HTTP says, what URI says, what REST says, what Tim says, what Roy says, what we have all said along this road! AFAICT, it also clears up some of the other TAG issues such as use of fragments on the web, simply each fragment when dereferencing refers to some element with a corresponding @id within the unidentified Representation returned. Sure it makes sense to align @id's when using content negotiation so that people don't get surprised, but it isn't a problem really, and both man (via knowledge) and machine (via knowledge of the above) can disambiguate nigh on instantly. Questions, disagreements, any cases you want me to apply this to in order to prove the theory? Finally, sorry it took so long to get something like this out, it's been a struggle with hundreds of incorrect paths taken and false assertions - I hope to hell this one is provably true! Best, Nathan
Received on Wednesday, 2 February 2011 01:24:54 UTC