Re: Comments on the LDP Spec: Creating new Resources

I'm afraid this discussion is not leading anywhere. As Alexandre pointed
out, this issue was discussed at length and a resolution was produced [1].

What confused you (and me at some point) was that the resolution was not
properly reflected in the spec/primer and the test suite does not send a
Link header with POST requests to create LDPRs. I think that can be
fixed though.

Still, it doesn't change the fact that the interaction model is *not*
driven by the RDF sent by the client, but instead by the HTTP Link
headers. This makes a lot of sense, since creating new Web resources
should be done through the HTTP protocol and not based on the data being
sent over the wires -- i.e. you would not use GET to *post* a form that
creates a new resource.

-- Andrei

[1] http://www.w3.org/2012/ldp/track/issues/91

On 10/09/2014 05:04 PM, Miguel Aragón wrote:
>> I agree with both of you. In our case we would reject the request. That’s why I don’t want the server to restrict what the server does in this case.
> 
> I’m sorry, typo:  "That’s why I don’t want the Spec to restrict what the server does in this case."
> 
> On Oct 9, 2014, at 4:03 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
> 
>> I agree with both of you. In our case we would reject the request. That’s why I don’t want the server to restrict what the server does in this case.
>>
>> On Oct 9, 2014, at 3:58 PM, Nandana Mihindukulasooriya <nmihindu@fi.upm.es> wrote:
>>
>>> IHMO, as David said the server has the freedom of honouring the slug or not and also 
>>>
>>> On Thu, Oct 9, 2014 at 10:55 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>> That’s very weird, because our platform passed all the tests of the LDP testsuite (except some related to LDPNRs). I would suppose that if it isn’t an LDP it shouldn’t pass them, right?
>>> From what I understand, LDP servers are in charge of what gets created on the platform, so deciding how the data is structured is something the server can do.
>>> The pointers that you shared are about interaction models which I think its a very different topic, please share with me the pointer that you refer to again. I can’t see what is what we are not following.
>>>
>>> And if you are not comfortable responding to my comments please don’t do it. I’m only trying to expose my opinion and the needs of our platform :).
>>>
>>> Best regards,
>>> Miguel
>>>
>>> On Oct 9, 2014, at 3:39 PM, Alexandre Bertails <alexandre@bertails.org> wrote:
>>>
>>>> On Thu, Oct 9, 2014 at 4:34 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>> Oh, please tell me why :)
>>>>
>>>> Because that is not how the group decided how to do things?
>>>>
>>>> Pardon me if I sound condescendant, really, but what you are doing
>>>> with your platform (driving the interaction with RDF) was discussed
>>>> *many* times in this working group and what came out of this is
>>>> fundamentally not what you are describing. The specification is very
>>>> clear on that. See the pointer I gave earlier.
>>>>
>>>> What you are asking is something very different than what is achieved in LDP.
>>>>
>>>> Alexandre
>>>>
>>>>>
>>>>> On Oct 9, 2014, at 3:33 PM, Alexandre Bertails <alexandre@bertails.org> wrote:
>>>>>
>>>>>> On Thu, Oct 9, 2014 at 4:32 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>>>> In our server resources are basically named graphs that contain a resource that shares the same name as the graph and additional resources that extend that resource (think, # resources). So for us, if you send a document like: [[ <somethingElse> a ldp:RDFSource. ]] to the URI: http://example.org/container/ we take that as if you are trying to create:
>>>>>>>
>>>>>>> graph <http://example.org/container/somethingElse> {
>>>>>>>       <http://example.org/container/somethingElse> a ldp:RDFSource.
>>>>>>> }
>>>>>>>
>>>>>>> That’s the way our platform works (not the way I think).
>>>>>>
>>>>>> Ah, then I am afraid that this is just not LDP...
>>>>>>
>>>>>> Alexandre
>>>>>>
>>>>>>>
>>>>>>> On Oct 9, 2014, at 3:27 PM, Alexandre Bertails <alexandre@bertails.org> wrote:
>>>>>>>
>>>>>>>> On Thu, Oct 9, 2014 at 4:24 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>>>>>> I’m sorry Alexandre, could you elaborate? I didn’t understand your response.
>>>>>>>>
>>>>>>>> Sure, but let me ask you a question first. You seem to think that the
>>>>>>>> presence of the triple [[ <somethingElse> a ldp:RDFSource. ]] in what
>>>>>>>> you post should create the resource <somethingElse>, module relative
>>>>>>>> URI resolution.
>>>>>>>>
>>>>>>>> Is that what you think?
>>>>>>>>
>>>>>>>> Alexandre
>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Oct 9, 2014, at 3:21 PM, Alexandre Bertails <alexandre@bertails.org> wrote:
>>>>>>>>>
>>>>>>>>>> On Thu, Oct 9, 2014 at 4:18 PM, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>>>>>>>> Hi Dave,
>>>>>>>>>>>
>>>>>>>>>>> I’m ok with that, I just don’t want the LDP Spec to force us to support null
>>>>>>>>>>> URIs and relative URIs without a base.
>>>>>>>>>>>
>>>>>>>>>>> If that’s the case then the LDP test suite needs to be modified because it
>>>>>>>>>>> sends both null URIs and relative URIs without a base (which may not be
>>>>>>>>>>> allowed by all servers).
>>>>>>>>>>
>>>>>>>>>> Miguel, you just do not control what resource get created using RDF,
>>>>>>>>>> nor you control its interaction model...
>>>>>>>>>>
>>>>>>>>>> Alexandre
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 3:14 PM, David Wood <david@3roundstones.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 16:04, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> The approach that I’m offering allows applications to be moved from one
>>>>>>>>>>> service to another. The problems with relative URIs are these:
>>>>>>>>>>>
>>>>>>>>>>> If non empty, relative URIs (ex. <something>) are accepted, it doesn't make
>>>>>>>>>>> much sense to support the Slug header. What would happen if both of them
>>>>>>>>>>> were used?
>>>>>>>>>>>
>>>>>>>>>>> Example:
>>>>>>>>>>> Slug: something
>>>>>>>>>>> <somethingElse> a ldp:RDFSource.
>>>>>>>>>>>
>>>>>>>>>>> By allowing the client to send both null URIs and non empty, relative URIs,
>>>>>>>>>>> a weird behaviour would be expected:
>>>>>>>>>>>
>>>>>>>>>>> If a null URI was used. The base of the document needs to be: (parent’s URI)
>>>>>>>>>>> + (slug created)
>>>>>>>>>>> If a non empty, relative URI was specified. The base of the document needs
>>>>>>>>>>> to be: (parent’s URI) <- making sure that it ends in a “/"
>>>>>>>>>>>
>>>>>>>>>>> The logic needed for this behaviour will impose an unnecessary overhead for
>>>>>>>>>>> each request.
>>>>>>>>>>> As far as we know, specifying relative URIs and not defining a base URI
>>>>>>>>>>> results in an invalid RDF document.
>>>>>>>>>>> If the server supported the creation of multiple resources on a single
>>>>>>>>>>> request, null URIs will overlap with each other.
>>>>>>>>>>> Common parsers (like Jena) don't treat null URIs and relative URIs
>>>>>>>>>>> consistently.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi Miguel,
>>>>>>>>>>>
>>>>>>>>>>> Thank you for clarifying your position.
>>>>>>>>>>>
>>>>>>>>>>> I think the thing that you are missing here is that the server always has
>>>>>>>>>>> the final say. It is up to the server to decide what to do with a Slug or
>>>>>>>>>>> when a base URI is missing. It might reject the request, use what it has or
>>>>>>>>>>> something else. This is in accordance with Web Architecture.
>>>>>>>>>>>
>>>>>>>>>>> For example, this issue report records what we (Callimachus Project) decided
>>>>>>>>>>> to do:
>>>>>>>>>>> https://github.com/3-Round-Stones/callimachus/issues/163
>>>>>>>>>>>
>>>>>>>>>>> Still, if LDP wants to specify this more tightly to assist interoperability,
>>>>>>>>>>> it will need to be careful. Deciding quickly could break a lot of services
>>>>>>>>>>> that are close to LDP compliance now.
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Dave
>>>>>>>>>>> --
>>>>>>>>>>> http://about.me/david_wood
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 2:58 PM, David Wood <david@3roundstones.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 15:51, Miguel Aragón <miguel.aragon@base22.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> You say you like them, but you haven’t addressed the problems that I
>>>>>>>>>>> described. I’m not saying they should be prohibited, I’m saying it shouldn’t
>>>>>>>>>>> be mandatory to support them.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi Miguel,
>>>>>>>>>>>
>>>>>>>>>>> I honestly don’t see the problem you say you outlined and I did in fact give
>>>>>>>>>>> you a use case since you said you don’t have one. Relative resolution of
>>>>>>>>>>> URIs to the base allows portability in both data and applications built on
>>>>>>>>>>> that data.
>>>>>>>>>>>
>>>>>>>>>>> Why is it difficult to support the generation of a URI based on the
>>>>>>>>>>> concatenation of a base URI and a relative URI? I am not trying to be
>>>>>>>>>>> difficult, I just don’t understand why that is hard.
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Dave
>>>>>>>>>>> --
>>>>>>>>>>> http://about.me/david_wood
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 2:43 PM, Andrei Sambra <andrei@w3.org> wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 10/09/2014 03:42 PM, David Wood wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 15:11, Steve Speicher <sspeiche@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Oct 9, 2014 at 3:05 PM, Miguel Aragón <miguel.aragon@base22.com>
>>>>>>>>>>> wrote:
>>>>>>>>>>> Hi Nandana, thanks for responding.
>>>>>>>>>>>
>>>>>>>>>>> Null URIs are actually very problematic, and (not null) relative URIs just
>>>>>>>>>>> make the problem worse. With the approach that we have: Generic Request
>>>>>>>>>>> URIs, hash URIs can be used in the same way:
>>>>>>>>>>>
>>>>>>>>>>> Method: POST
>>>>>>>>>>> URL: http://example.org/container/
>>>>>>>>>>> Slug: miguel
>>>>>>>>>>> Body:
>>>>>>>>>>> @base <http://example.org/generic-requests/123123123123>.
>>>>>>>>>>> <> a foaf:PersonalProfileDocument;
>>>>>>>>>>> foaf:primaryTopic <#me>.
>>>>>>>>>>>
>>>>>>>>>>> Is resolved to
>>>>>>>>>>>
>>>>>>>>>>> <http://example.org/container/miguel> a foaf:PersonalProfileDocument;
>>>>>>>>>>> foaf:primaryTopic <http://example.org/container/miguel#me>.
>>>>>>>>>>>
>>>>>>>>>>> I honestly don’t see the case for using relative URIs (null or not null) at
>>>>>>>>>>> all. They bring many problems to the server and make the request document an
>>>>>>>>>>> invalid RDF document.
>>>>>>>>>>>
>>>>>>>>>>> I believe this is a general misconception, the base URI to use for
>>>>>>>>>>> resolution just instead carried outside the entity body.  Many RDF libraries
>>>>>>>>>>> allow you to supply the absolute base URI to use for resolution when handing
>>>>>>>>>>> off the model, this topic was discussed on the list some time ago [1].
>>>>>>>>>>>
>>>>>>>>>>> Since it is a common stumbling block and not that clear, I would suggest we
>>>>>>>>>>> include additional guidance in the best practices and guidance document [2].
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> For what it is worth, we just love relative URIs. This is because they allow
>>>>>>>>>>> us to easy move applications from one service to another. We would be quite
>>>>>>>>>>> unhappy if we could not both use relative URIs and be LDP compliant.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> +1
>>>>>>>>>>>
>>>>>>>>>>> Relative URIs are incredibly useful.
>>>>>>>>>>>
>>>>>>>>>>> -- Andrei
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Dave
>>>>>>>>>>> --
>>>>>>>>>>> http://about.me/david_wood
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> - Steve
>>>>>>>>>>>
>>>>>>>>>>> [1]: http://lists.w3.org/Archives/Public/public-ldp-wg/2014Apr/0008.html
>>>>>>>>>>> [2]:
>>>>>>>>>>> https://dvcs.w3.org/hg/ldpwg/raw-file/default/ldp-bp/ldp-bp.html#use-relative-uris
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Oct 9, 2014, at 1:55 PM, Nandana Mihindukulasooriya <nmihindu@fi.upm.es>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi Miguel,
>>>>>>>>>>>
>>>>>>>>>>> I guess the most common use case for the (not null) relative URIs is usage
>>>>>>>>>>> of hash URIs. For example, something like this.
>>>>>>>>>>>
>>>>>>>>>>> <> a foaf:PersonalProfileDocument;
>>>>>>>>>>> foaf:primaryTopic <#me> .
>>>>>>>>>>>
>>>>>>>>>>> I think this case is less problematic because typically the profile document
>>>>>>>>>>> <> will become something like  <http://ex.org/container/miguel> and the
>>>>>>>>>>> <#me> becomes <http://ex.org/container/miguel#me>.
>>>>>>>>>>>
>>>>>>>>>>> But if you have something like
>>>>>>>>>>>
>>>>>>>>>>> <> a foaf:PersonalProfileDocument;
>>>>>>>>>>> ex:property <anotherResource> .
>>>>>>>>>>>
>>>>>>>>>>> This is a bit problematic because the resolution of it is a bit dependent of
>>>>>>>>>>> ending slash. The above snippet resolved against the base
>>>>>>>>>>> <http://ex.org/container/miguel> will become
>>>>>>>>>>>
>>>>>>>>>>> (a) <http://ex.org/container/miguel> a foaf:PersonalProfileDocument;
>>>>>>>>>>> ex:property <http://ex.org/container/anotherResource> .
>>>>>>>>>>>
>>>>>>>>>>> and the same is resolved against the base <http://ex.org/container/miguel/>
>>>>>>>>>>> will become
>>>>>>>>>>>
>>>>>>>>>>> (b) <http://ex.org/container/miguel/> a foaf:PersonalProfileDocument;
>>>>>>>>>>> ex:property <http://ex.org/container/miguel/anotherResource> .
>>>>>>>>>>>
>>>>>>>>>>> However, I think LDP clients should never use the (a) with the slug to refer
>>>>>>>>>>> to itself because it can always use the null URI to refer to itself. We also
>>>>>>>>>>> discourage the use of dot segment relative URIs in the LDP BP. I wonder what
>>>>>>>>>>> are practical usages of non-hash relative URIs in POSTed content (before
>>>>>>>>>>> creation when the base of the document is unknown still).
>>>>>>>>>>>
>>>>>>>>>>> Best Regards,
>>>>>>>>>>> Nandana
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Oct 9, 2014 at 6:25 PM, Miguel Aragon <miguel.aragon@base22.com>
>>>>>>>>>>> wrote:
>>>>>>>>>>> Hello to everyone
>>>>>>>>>>> Based on the design and implementation process that my team and I have
>>>>>>>>>>> experience, I've several comments about the LDP Spec that I'd like to share
>>>>>>>>>>> with you. But first lets make sure that we talk in the same language:
>>>>>>>>>>>
>>>>>>>>>>> Concepts
>>>>>>>>>>> Note: Keep in mind that these are the concepts that are working for us. By
>>>>>>>>>>> no means I'm criticising the "Academic point of view"
>>>>>>>>>>> Relative URI: A relative URI that was not resolved to an absolute URI
>>>>>>>>>>> because the document didn't specified a base URI (@base).
>>>>>>>>>>> Null URI: an empty, relative URI.
>>>>>>>>>>>
>>>>>>>>>>> Creation of LDP RDF Sources (LDPRS)
>>>>>>>>>>> There are several key points in section 5.1 Introduction that need to be
>>>>>>>>>>> considered:
>>>>>>>>>>> An LDPRS can be created by issuing a POST to an LDPC.
>>>>>>>>>>> The client can specify a Slug header to provide a hint of the URI desired
>>>>>>>>>>> for the new resource.
>>>>>>>>>>> The examples show that a null URI can be used for the resource to be
>>>>>>>>>>> created. The resulting URI will be forged by the server.
>>>>>>>>>>> The LDP test suite goes beyond this and uses relative URIs in the resources
>>>>>>>>>>> that are POSTed to the server. (ex. <something> a ldp:RDFSource. ).
>>>>>>>>>>> At first we followed this approach, but when we started using JSON-LD as our
>>>>>>>>>>> main RDF format, we started encountering several problems with it:
>>>>>>>>>>> If non empty, relative URIs (ex. <something>) are accepted, it doesn't make
>>>>>>>>>>> much sense to support the Slug header. What would happen if both of them
>>>>>>>>>>> were used?
>>>>>>>>>>>
>>>>>>>>>>> Example:
>>>>>>>>>>> Slug: something
>>>>>>>>>>> <somethingElse> a ldp:RDFSource.
>>>>>>>>>>>
>>>>>>>>>>> By allowing the client to send both null URIs and non empty, relative URIs,
>>>>>>>>>>> a weird behaviour would be expected:
>>>>>>>>>>> If a null URI was used, forge a slug for the new resource and take the LDPC
>>>>>>>>>>> URI as a base for the URI of the resource to be created.
>>>>>>>>>>> If a non empty, relative URI was specified, treat that as a hint for the
>>>>>>>>>>> desired slug and use the LDPC URI as a base for the URI of the resource to
>>>>>>>>>>> be created.
>>>>>>>>>>> The logic needed for this behaviour will impose an unnecessary overhead for
>>>>>>>>>>> each request.
>>>>>>>>>>> As far as we know, specifying relative URIs and not defining a base URI
>>>>>>>>>>> results in an invalid RDF document.
>>>>>>>>>>> If the server supported the creation of multiple resources on a single
>>>>>>>>>>> request, null URIs will overlap with each other.
>>>>>>>>>>> Common parsers (like Jena) don't treat null URIs and relative URIs
>>>>>>>>>>> consistently.
>>>>>>>>>>> Some of the possible approaches for addressing these problems are:
>>>>>>>>>>> The obvious solution would be to use fully qualified URIs on every request.
>>>>>>>>>>> But the client doesn't always know what the resulting URI will be.
>>>>>>>>>>> Another approach would be to use a placeholder, a fully qualified URI that
>>>>>>>>>>> the server knows it's acting just as a placeholder (Ex.
>>>>>>>>>>> <http://example.org/placeholder>). But that would mean the client is
>>>>>>>>>>> constantly specifying new triples for the same resource (in an academic
>>>>>>>>>>> point of view). And the problem of multiple resources on a single request
>>>>>>>>>>> wouldn't be solved by this approach.
>>>>>>>>>>> After some thought, we came with the concept of "Generic Request URI".
>>>>>>>>>>>
>>>>>>>>>>> Generic Request URI
>>>>>>>>>>> A URI that has as a base, a known and never changing URI, and that ends with
>>>>>>>>>>> a slug that is different for every Generic Request URI created (in our case
>>>>>>>>>>> a timestamp).
>>>>>>>>>>> Example
>>>>>>>>>>> A template of the form: http://example.org/generic-requests/<timestamp>
>>>>>>>>>>> would create URIs like:
>>>>>>>>>>> <http://example.org/generic-requests/1412868212000>
>>>>>>>>>>> <http://example.org/generic-requests/1412868258000>
>>>>>>>>>>> <http://example.org/generic-requests/1412868262000>
>>>>>>>>>>> Using a Generic Request URI when creating resources covers the following
>>>>>>>>>>> problems:
>>>>>>>>>>> It standardises the URIs the server will receive.
>>>>>>>>>>> If the client wants to specify a hint, it would do so by passing a Slug
>>>>>>>>>>> header.
>>>>>>>>>>> Each request describes a unique resource and thus it is academically
>>>>>>>>>>> correct.
>>>>>>>>>>> Multiple resources can be created by declaring each one with a different
>>>>>>>>>>> Generic Request URI.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> So an LDP server would accept requests with the following forms:
>>>>>>>>>>> A resource with a fully qualified URI. In this case the client attempts to
>>>>>>>>>>> create a resource with a known URI so a Slug header isn't allowed and if the
>>>>>>>>>>> URI is already in use the server would respond with 409 Conflict.
>>>>>>>>>>> A resource with a Generic Request URI and no slug specified. The server
>>>>>>>>>>> would use the URI of the parent resource as a base and forge a slug for the
>>>>>>>>>>> new resource however the server is configured to do so.
>>>>>>>>>>> A resource with a Generic Request URI and a Slug header. The server would
>>>>>>>>>>> use the Slug header as a hint for the URI of the new resource to be created.
>>>>>>>>>>> I've more comments and concepts to share, but I will write another email for
>>>>>>>>>>> them.
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Miguel Aragón
>>>>>>>>>>> Mobile: +52 (811) 798 9357
>>>>>>>>>>> Skype: miguel.araco
>>>>>>>>>>> Email: miguel.aragon@base22.com
>>>>>>>>>>> CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is
>>>>>>>>>>> for the sole use of the intended recipient(s) and may contain confidential
>>>>>>>>>>> and privileged information. Any unauthorized review, use, disclosure or
>>>>>>>>>>> distribution is prohibited. If you are not the intended recipient, please
>>>>>>>>>>> contact the sender by reply e-mail and destroy all copies of the original
>>>>>>>>>>> message.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>
>>>
>>>
>>>
>>
> 
> 

Received on Thursday, 9 October 2014 21:13:38 UTC