- From: Steve Speicher <sspeiche@gmail.com>
- Date: Tue, 26 Nov 2013 14:48:40 -0500
- To: Alexandre Bertails <bertails@w3.org>
- Cc: "Linked Data Platform (LDP) Working Group" <public-ldp-wg@w3.org>
- Message-ID: <CAOUJ7JqSxXg0Vir=SbfBiiYuU05ww2jbVQvHjv=UDBdYPNfn5w@mail.gmail.com>
Hi Alexandre, On Tue, Nov 26, 2013 at 10:18 AM, Alexandre Bertails <bertails@w3.org> wrote: > > Hi Steve, > > > On 11/26/2013 08:25 AM, Steve Speicher wrote: >> >> Hi, >> >> On Fri, Nov 22, 2013 at 5:28 PM, Linked Data Platform (LDP) Working >> Group Issue Tracker <sysbot+tracker@w3.org >> <mailto:sysbot+tracker@w3.org>> wrote: >> >> ldp-ISSUE-91 (rel='type' Link-based interaction): The LDP (REST) >> interactions must be driven by the rel='type' Link header [Linked >> Data Platform Spec] >> >> http://www.w3.org/2012/ldp/track/issues/91 >> >> Raised by: Alexandre Bertails >> On product: Linked Data Platform Spec >> >> We have already agreed that LDP interactions are not strictly >> hypermedia driven, as we agreed not to define a new media-type for >> LDP. Instead we have a Link header for Resource [1]. >> >> The problem is that 4.2.10 [1] does not really advertise the LDP >> interaction, just the "LDP support" for the resource, and the >> interaction is currently derived from a { <> a ldp:Container } >> triple (or its absence). That means than I cannot create a simple >> LDPR with that triple _without_ the related interaction model. This >> is wrong. >> >> >> "This is wrong" needs more elaboration in this context. By creating it >> with this type, the client is stating it is that and what the >> interaction model is. > > > "This is wrong" regarding what REST is about [2]. > > [2] http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven I figured this card was going to be played but I was asking for something a bit more specific to the case we are discussing (how that reference in this specific case is causing some issue). I'll touch on it a bit more later. > > > We are already playing with the hypermedia thing, some people would > argue that we should not say we do REST... Just remember what happened > to "SPARQL 1.1 Graph Store HTTP Protocol", which removed all mentions > of REST from the specification. > > We have already decided to use the type-Link header for LDPR, and I > just propose here to extend this approach to the LDPC. To be clear, this is only a response header. I could see expanding it to be include LDPC. Though adding as a request header, would have to be given a bit more consideration. > > >> There are very few cases where there are >> differences, POST only. > > > I would argue it's not only POST: > > * GET-on-LDPC and GET-on-LDPR don't have (yet) the same exact > semantics (see ISSUE-90). I've read that issue and not entirely clear to me the difference. > > > * PUT-on-LDPC has overridden semantics regarding the membership > triples. Well, if it were me we'd save energy talking about PUT-on-LDPC here and just do PATCH. So fixing these PUT cases may be necessary but in time, may not be. > > > I don't know how people are planning to implement that in > practice. For what I'm concerned, there is a disjunction between the > LDPR and LDPC logics, and I suspect that most of the implementations > will reflect that. I may be wrong of course. > > >> My proposal is to say that the interaction model is directly (and >> solely) derived from the "type" Link header, having one for the LDPR >> and one for the LDPC. This is aligned with the previous proposal of >> not defining a new media type but to extend the existing RDF ones >> with the rel='type' Link header. >> >> For an LDPR (and ideally for Binary if it also were an LDPR): >> Link: <http://www.w3.org/ns/ldp#Resource>; rel="type" >> >> For an LDPC: >> Link: <http://www.w3.org/ns/ldp#Container>; rel="type" >> >> Now, I can copy the content of an LDPC (eg. for backup purposes) >> into a new LDPR, without inheriting the LDPC interactions. >> >> >> Please elaborate on this motivating use case "backup purposes". What >> LDPC interactions cause problems? The only "real" difference would be >> POST behavior...right? If if is a backup, wouldn't the ACL be set to >> prohibit writing to it, so POST, PUT, PATCH wouldn't be supported. > > > It has nothing to do with ACLs. > > Here is a full example. > > [[ > $ curl -i http://example.org/container1/ > ... > Content-Type: text/turtle; charset=UTF-8 > > Link: <http://www.w3.org/ns/ldp#Resource>; rel="type" > ... > <> > a ldp:Container; > ldp:containerResource <> ; > ldp:containsRelation rdfs:member; > ldp:insertedContentRelation ldp:MemberSubject; > dcterms:title "A very simple container"; > rdfs:member <member1>, <member2>, <member3>. > ]] > > Now, I want to save that content somewhere else. > > [[ > $ curl -X POST -i \ > -H 'Content-Type: text/turtle; utf-8' \ > -H 'Slug: container1/' \ > -d @./container1.ttl \ > http://betehess.example.org/myContainer/ > ]] > > In this case, I didn't want `myContainer` to create a real Container, > just a plain regular LDPR-RDF, which just happens to have { <> a > ldp:Container } in it. So this assumes that your implementation must create something a bit heavy weight to deal with LDPCs. Ok, I understand the use case better now and how it doesn't deal with ACLs. Though I could see a number of implementations only creating transient objects of lighter weight to deal with certain LDPC requests (for example if impl knew it was always going to be a read-only container, it wouldn't have to worry about as much). > > > With my proposal, you would do the following to create an LDPC: > > [[ > $ curl -X POST -i \ > -H 'Content-Type: text/turtle; utf-8' \ > -H 'Link: <http://www.w3.org/ns/ldp#SimpleContainer>; rel="type"' \ > -H 'Slug: container1/' \ > -d @./container1.ttl http://betehess.example.org/myContainer/ > ]] > > And you can see here why the indirection of the DirectContainer (and > of course the IndirectContainer as well) is problematic. So you are only proposing this request header on POST (create) of a LDPC? Ok, that would be good to understand. I would assume we should prohibit giving an LDPR LDPC semantics? > > > >> I'm not sure this added complexity really fixes anything. A client >> would request LDPR semantics on a LDPC, say for a POST request, though a >> server could reject it. How does this help the client out? >> >> >> Also, creating an LDPC is now easy to define (and implement): you >> POST a document *with* the corresponding Link header (otherwise, >> it's an LDPR, or a Binary). >> >> Creating an LDPC was easy before, you just POST the LDPC representation. >> Would you expect the Link header to possibly be different from the >> rdf:type in the LDPR? > > > The rdf:type would be used for validation only, just like the rest of > the body. If the nature of a POSTed resource was defined by what's in > the body, that would be a precedent in the REST world. In the REST world can you create a "service" and then in that a "shopping cart service"? How do those things come into existence? I would assume in a REST world you'd POST a descriptor to "create" those services. The behavior of those services would be based on the descriptors of them. > > > >> Would it be expected that the server maintain the >> value of the link header as the preferred default semantics of the >> resource, instead of derived from rdf:type? > > > Totally. In our case, the type-Link header (plus the real > Content-Type) behave like a new media type. So this has the drawback that it can never change. Or do you expect a PUT on the LDPC with Link: <http://w3.org/ns/ldp#SimpleContainer> rel='type' (or some other means) to modify the behavior originally set by the client? I don't think this model gets us into any better of a place. > > >> An advantage I see with this Link header is that I server wouldn't have >> to parse the request document to locate the rdf:type, unless it wanted >> to do some additional validation. > > > I have made this argument so many times :-) > > Note that the "additional validation" has nothing to do with LDP, as > LDP is only about the interactions (well, almost :-). I'm not sure exactly what you mean but some applications may want to provide additional diagnostics when there are potential conflicts in their headers and data, that is what I was talking about. Such as: "Hmmm...the client said do this request as a LDPC on a LDPR, that seems a little odd". > > > >> If you want to "turn off" membership triple creation when a new resource >> is created via POST to LDPC, it would be good to understand if that is >> what this issue is trying to accomplish as it seems like it is. If so >> or not, then it would help me understand it better. > > > It's not that much about the membership triple creation. It's more > about the nature of the resource, as the resource would not be an LDPC > to begin with. This doesn't really answer the question, I believe you answered it before by confirming the POST behavior, saying there might be something on GET (ISSUE-90) and PUT on LDPCs. I'm curious how common this "archive" case is and it could just be up to a few implementations that need a hint to just "archive" and not treat resource with an additional semantics. For a number of LD applications I have seen, they desire a consistent way to do archiving but more of a verb (like DELETE) or resource state (like archived=true, or archivedDate=) Thanks for taking the time to elaborate the details of your issue and use case. - Steve Speicher > > Alexandre. > >> - Steve Speicher >> >> >> Alexandre. >> >> [1] https://dvcs.w3.org/hg/ldpwg/raw-file/default/ldp.html#ldpr-4_2_10 >>
Received on Tuesday, 26 November 2013 19:49:08 UTC