W3C

Linked Data Platform 1.0

W3C Last Call Working Draft

This version:
http://www.w3.org/TR/2013/WD-ldp-20130730/
Latest published version:
http://www.w3.org/TR/ldp/
Latest editor's draft:
http://www.w3.org/2012/ldp/hg/ldp.html
Previous version:
http://www.w3.org/TR/2013/WD-ldp-20130307/
Editors:
Steve Speicher, IBM Corporation
John Arwe, IBM Corporation
Ashok Malhotra, Oracle Corporation

Abstract

This document describes a set of best practices and simple approach for a read-write Linked Data architecture, based on HTTP access to web resources that describe their state using the RDF data model.

Status of This Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This document was published by the Linked Data Platform Working Group as a Last Call Working Draft. This document is intended to become a W3C Recommendation. If you wish to make comments regarding this document, please send them to public-ldp-comments@w3.org (subscribe, archives). The Last Call period ends 02 September 2013. All comments are welcome.

Publication as a Last Call Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This is a Last Call Working Draft and thus the Working Group has determined that this document has satisfied the relevant technical requirements and is sufficiently stable to advance through the Technical Recommendation process.

This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

Table of Contents

1. Introduction

This section is non-normative.

This document describes the use of HTTP for accessing, updating, creating and deleting resources from servers that expose their resources as Linked Data.  It provides clarifications and extensions of the four rules of Linked Data [LINKED-DATA]:

1. Use URIs as names for things

2. Use HTTP URIs so that people can look up those names

3. When someone looks up a URI, provide useful information, using the standards (RDF*, SPARQL)

4. Include links to other URIs, so that they can discover more things

This specification discusses standard HTTP and RDF techniques and best practices that you should use, and anti-patterns you should avoid, when constructing clients and servers that read and write Linked Data resources.

A special type of Linked Data Platform Resource is a Container. Containers are very useful in building application models involving collections of homogeneous resources. For example, universities offer a collection of classes and have a collection of faculty members, each faculty member teaches a collection of courses, etc. This specification discusses how to work with containers. Resources can be added to containers in several ways. As a special case, members can both be created and added to a container by overloading the POST operation (see section 5.4 ).

Another contribution of this specification is how to deal with large amounts of data. Depending on the server’s capabilities, a GET request on a Linked Data Platform Resource returns a set of pages and uses a convention to access any subsequent page (see section 4.10 ).

The intention of this document is to enable additional rules and layered groupings of rules as additional specifications. The scope is intentionally narrow to provide a set of key rules for reading and writing Linked Data that most, if not all, other specifications will depend upon and implementations will support.

2. Terminology

Terminology is based on W3C's Architecture of the World Wide Web [WEBARCH] and Hyper-text Transfer Protocol [HTTP11].

Link
A relationship between two resources when one resource (representation) refers to the other resource by means of a URI [WEBARCH].

Linked Data
As defined by Tim Berners-Lee [LINKED-DATA].

Linked Data Platform Resource (LDPR)
HTTP resource whose state is represented in RDF that conforms to the simple lifecycle patterns and conventions in section 4. .

Linked Data Platform Container (LDPC)
An LDPR representing a collection of same-subject, same-predicate triples which is uniquely identified by a URI that responds to client requests for creation, modification, and enumeration of its members.

Client
A program that establishes connections for the purpose of sending requests [HTTP11].

Server
An application program that accepts connections in order to service requests by sending back responses.

Any given program may be capable of being both a client and a server; our use of these terms refers only to the role being performed by the program for a particular connection, rather than to the program's capabilities in general. Likewise, any server may act as an origin server, proxy, gateway, or tunnel, switching behavior based on the nature of each request [HTTP11].

Membership triples
A set of triples in an LDPC's state that lists its members. The membership triples of a container all have the same subject and predicate, and the objects of the membership triples identify the container's members.

Membership subject
The subject of all a LDPC's membership triples.

Membership predicate
The predicate of all a LDPC's membership triples.

Page resource
A type of LDPR that is associated to another LDPR and whose representation includes a subset of the triples in the associated LDPR.

Non-member resource
A resource associated with a LDPC by a server for the purpose of enabling clients to retrieve a subset of the LDPC's state, namely the subset that omits the LDPC's membership triples. In other words, the union of the non-member resource's state and the LDPC's membership triples exactly equals the LDPC's state.

Resource inlining
The practice of responding to a HTTP GET request made to a request URI R0 with a representation that includes the state of R0, the entire state of resources accessed through other request URI(s) R1...Rn, and assertions from the server identifying the additional resources whose entire state has been provided. R1...Rn identify the inlined resource(s). See section 4.11 for details.

Member inlining
A special case of resource inlining, where all members of a container on a given page are inlined. The response page may or may not include all of the container's members. See section 5.10 for details.

2.1 Conventions Used in This Document

Sample resource representations are provided in text/turtle format [TURTLE].

Commonly used namespace prefixes:

	@prefix dcterms: <http://purl.org/dc/terms/>.
	@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
	@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>.
	@prefix ldp:     <http://www.w3.org/ns/ldp#>.
	@prefix xsd:     <http://www.w3.org/2001/XMLSchema#>.

3. Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MUST, MUST NOT, REQUIRED, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this specification are to be interpreted as described in [RFC2119].

The status of the sections of Linked Data Platform 1.0 (this document) is as follows:

A conforming LDP server is an application program that processes HTTP requests and generates HTTP responses that conform to the rules defined in section 4. Linked Data Platform Resources and section 5. Linked Data Platform Containers.

A conforming LDP client is an application program that generates HTTP requests and processes HTTP responses that conform to the rules defined in section 4. Linked Data Platform Resources and section 5. Linked Data Platform Containers.

4. Linked Data Platform Resources

4.1 Informative

This section is non-normative.

Linked Data Platform Resources (LDPRs) are HTTP resources that conform to the simple patterns and conventions in this section. HTTP requests to access, modify, create or delete LDPRs are accepted and processed by LDPR servers. Most LDPRs are domain-specific resources that contain data for an entity in some domain, which could be commercial, governmental, scientific, religious, or other.

Some of the rules defined in this document provide clarification and refinement of the base Linked Data rules [LINKED-DATA]; others address additional needs.

The rules for Linked Data Platform Resources address basic questions such as:

Additional informative guidance is available on the working group's wiki that addresses deployment questions such as:

The following sections define the rules and guidelines for use of LDPRs. This document also explains how to include information about each member in the resource’s own representation and how to paginate the resource representation if it gets too big.

4.2 General

4.2.1 LDPR servers MUST at least be HTTP/1.1 conformant servers [HTTP11].
4.2.2 LDPR servers MUST provide an RDF representation for LDPRs. The HTTP Request-URI of the LDPR is typically the subject of most triples in the response.
4.2.3 LDPR servers MAY host a mixture of LDPRs and non-LDPRs. For example, it is common for LDPR servers to need to host binary or text resources that do not have useful RDF representations.
4.2.4 LDPRs SHOULD reuse existing vocabularies instead of creating their own duplicate vocabulary terms. In addition to this general rule, some specific cases are covered by other conformance rules.
4.2.4.1 LDPR predicates SHOULD use standard vocabularies such as Dublin Core [DC-TERMS], RDF [RDF-CONCEPTS] and RDF Schema [RDF-SCHEMA], whenever possible.
4.2.5 LDPR representations SHOULD have at least one rdf:type set explicitly.  This makes the representations much more useful to client applications that don’t support inferencing.
4.2.6 LDPR servers MAY support standard representations beyond those necessary to conform to this specification. These could be other RDF formats, like N3 or NTriples, but non-RDF formats like HTML [HTML401] and JSON [RFC4627] would likely be common.
4.2.7 LDPRs MAY be created, updated and deleted using methods not defined in this document, for example through application-specific means, SPARQL UPDATE, etc. [SPARQL-UPDATE], as long as those methods do not conflict with this specification's normative requirements.
4.2.8 LDPR server responses MUST use entity tags (either weak or strong ones) as response ETag header values.
4.2.9 LDPR servers SHOULD enable simple creation and modification of LDPRs. It is common for LDPR servers to put restrictions on representations – for example, the range of rdf:type predicates, datatypes of the objects of predicates, and the number of occurrences of predicates in an LDPR, but servers SHOULD minimize those restrictions.  Enforcement of more complex constraints will greatly restrict the set of clients that can modify resources. For some server applications, excessive constraints on modification of resources may be required.
4.2.10 LDPR servers MUST advertise their LDP support by exposing a HTTP Link header with a target URI of http://www.w3.org/ns/ldp/Resource, and a link relation type of type (that is, rel="type") in all responses to requests made to the resource's HTTP Request-URI. This is notionally equivalent to the presence of a (subject-URI, rdf:type, ldp:Resource) triple in the resource. The HTTP Link header is the method by which servers assert their support for the LDP specification in a way that clients can introspect dynamically at run-time. Conservative clients should note that a server can host a mixture of LDPRs and other resources, and therefore there is no implication that LDP support advertised on one HTTP Request-URI means that other resources on the same server are also LDPRs. Each HTTP Request-URI needs to be individually introspected by a conservative client, in the absence of outside information.
4.2.11 LDPR servers MUST NOT require LDP clients to implement inferencing in order to recognize the subset of content defined by LDP. Other specifications built on top of LDP may require clients to implement inferencing [RDF-CONCEPTS]. The practical implication is that all content defined by LDP must be explicitly represented.
4.2.12 LDPR servers MUST assign the default base-URI for [RFC3987] relative-URI resolution to be the HTTP Request-URI when the resource already exists, and to the URI of the created resource when the request results in the creation of a new resource.

4.3 HTTP GET

4.3.1 LDPR servers MUST support the HTTP GET Method for LDPRs.
4.3.2 LDPR servers MUST support the HTTP response headers defined in section 4.9 .
4.3.3 LDPR servers SHOULD provide a text/turtle representation of the requested LDPR [TURTLE].
4.3.4 LDPR servers MAY provide representations of the requested LDPR beyond those necessary to conform to this specification, using standard HTTP content negotiation ([HTTP11] Section 12 - Content Negotiation). If the client does not indicate a preference, text/turtle SHOULD be returned.
4.3.5 In the absence of special knowledge of the application or domain, LDPR clients MUST assume that any LDPR can have multiple values for rdf:type.
4.3.6 In the absence of special knowledge of the application or domain, LDPR clients MUST assume that the rdf:type values of a given LDPR can change over time.

4.4 HTTP POST

This specification adds no new requirements on HTTP POST for LDPRs even when the LDPR supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

Creation of LDPRs can be done via POST (section 5.4 ) or PUT (section 5.5 ) to a LDPC, see those sections for more details.

4.5 HTTP PUT

This specification imposes the following new requirements on HTTP PUT for LDPRs only when the LDPR supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

4.5.1 If HTTP PUT is performed on an existing resource, LDPR servers MUST replace the entire persistent state of the identified resource with the entity representation in the body of the request. LDPR servers MAY ignore server managed properties such as dcterms:modified and dcterms:creator if they are not under client control. Any LDPR servers that wish to support a more sophisticated merge of data provided by the client with existing state stored on the server for a resource MUST use HTTP PATCH, not HTTP PUT.
4.5.2 LDPR clients SHOULD use the HTTP If-Match header and HTTP ETags to ensure it isn’t modifying a resource that has changed since the client last retrieved its representation. LDPR servers SHOULD require the HTTP If-Match header and HTTP ETags to detect collisions. LDPR servers MUST respond with status code 412 (Condition Failed) if ETags fail to match when there are no other errors with the request [HTTP11]. LDPR servers that require conditional requests MUST respond with status code 428 (Precondition Required) when the absence of a precondition is the only reason for rejecting the request [RFC6585].
4.5.3 LDPR clients SHOULD always assume that the set of predicates for a resource of a particular type at an arbitrary server is open, in the sense that different resources of the same type may not all have the same set of predicates in their triples, and the set of predicates that are used in the state of any one resource is not limited to any pre-defined set.
4.5.4 LDPR clients SHOULD assume that an LDPR server could discard triples whose predicates the server does not recognize or otherwise chooses not to persist. In other words, LDPR servers MAY restrict themselves to a known set of predicates, but LDPR clients MUST NOT restrict themselves to a known set of predicates when their intent is to perform a later HTTP PUT to update the resource.
4.5.5 An LDPR client MUST preserve all triples retrieved using HTTP GET that it doesn’t change whether it understands the predicates or not, when its intent is to perform an update using HTTP PUT.  The use of HTTP PATCH instead of HTTP PUT for update avoids this burden for clients [RFC5789].
4.5.6 LDPR servers MAY choose to allow the creation of new resources using HTTP PUT.
4.5.7 LDPR servers SHOULD allow clients to update resources without requiring detailed knowledge of server-specific constraints.   This is a consequence of the requirement to enable simple creation and modification of LPDRs.

4.6 HTTP DELETE

This specification imposes the following new requirements on HTTP DELETE for LDPRs only when the LDPR supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

Additional requirements on HTTP DELETE of LDPRs within containers can be found in section 5.6 .

4.6.1 LDPR servers MUST remove the resource identified by the Request-URI. After a successful HTTP DELETE, a subsequent HTTP GET on the same Request-URI MUST result in a 404 (Not found) or 410 (Gone) status code. Clients SHOULD note that servers MAY reuse a URI under some circumstances.
4.6.2 LDPR servers MAY alter the state of other resources as a result of an HTTP DELETE request. For example, it is acceptable for the server to remove triples from other resources whose subject or object is the deleted resource. It is also acceptable and common for LDPR servers to not do this – behavior is server application specific.

4.7 HTTP HEAD

Note that certain LDP mechanisms, such as paging, rely on HTTP headers, and HTTP generally requires that HEAD responses include the same headers as GET responses. Thus, implementers should also carefully read section 4.3 and section 4.9 .

4.7.1 LDPR servers MUST support the HTTP HEAD method.

4.8 HTTP PATCH

This specification imposes the following new requirements on HTTP PATCH for LDPRs only when the LDPR supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

4.8.1 LDPR servers MAY implement HTTP PATCH to allow modifications, especially partial replacement, of their resources [RFC5789]. No minimal set of patch document formats is mandated by this document.
4.8.2 LDPR servers SHOULD allow clients to update resources without requiring detailed knowledge of server-specific constraints.   This is a consequence of the requirement to enable simple creation and modification of LPDRs.
4.8.3 LDPR servers SHOULD NOT allow clients to create new resources using PATCH. POST (to an LDPC) and/or PUT should be used as the standard way to create new LDPRs.
4.8.4 LDPR servers that support PATCH MUST include an Accept-Patch HTTP response header [RFC5789] on HTTP OPTIONS requests, listing patch document media type(s) supported by the server.

4.9 HTTP OPTIONS

This specification imposes the following new requirements on HTTP OPTIONS for LDPRs beyond those in [HTTP11]. Other sections of this specification, for example PATCH, Accept-Post and Paging, add other requirements on OPTIONS responses.

4.9.1 LDPR servers MUST support the HTTP OPTIONS method.
4.9.2 LDPR servers MUST indicate their support for HTTP Methods by responding to a HTTP OPTIONS request on the LDPR’s URL with the HTTP Method tokens in the HTTP response header Allow.

4.10 Paging

4.10.1 Introduction

This section is non-normative.

It sometimes happens that a resource is too large to reasonably transmit its representation in a single HTTP response. This will be especially true if the resource representation includes many triples both from its own representation and from the representations of any inlined resources. A client could anticipate that a resource will be too large - for example, a client tool that accesses defects may assume that an individual defect will usually be of sufficiently constrained size that it makes sense to request all of it at once, but that the container of all the defects ever created will typically be too big. Alternatively, a server could recognize that a resource that has been requested is too big to return in a single message.

To address this problem, LDPRs should support a technique called Paging.  Paging can be achieved with a simple RDF pattern. For each resource, <resourceURL>, we define a new 'first page' resource. In this example, its URL will be <resourceURL>?firstPage, but servers are free to construct the URL as they see fit. The triples in the representation of the each page are typically a subset of the triples in the resource - same subject, predicate and object.

LDPR servers may respond to requests for a resource by redirecting the client to the first page resource – using a 303 “See Other” redirect to the actual URL for the page resource. Alternatively, clients may introspect the resource for a paged representation and use it preferentially when available.

Looking at an example resource representing Example Co.'s customer relationship data, we’ll split the response across two pages.   To find the URL of the first page, the client makes a OPTIONS request to the resource's URL, and in the response looks for a HTTP Link header with rel="first"; the target URI in the header is the URL of the first page resource. The client then requests the first page as http://example.org/customer-relations?firstPage:

Example 1
# The following is the representation of
#    http://example.org/customer-relations?firstPage
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix o: <http://example.org/ontology/>.

<http://example.org/customer-relations>
   a o:CustomerRelations;
   dcterms:title "The customer information for Example Co.";
   o:client <client#JohnZSmith>, <client#BettyASmith>, <client#JoanRSmith>. 

<http://example.org/customer-relations?firstPage>
   a ldp:Page;
   ldp:pageOf <http://example.org/customer-relations>;
   ldp:nextPage <http://example.org/customer-relations?p=2>.

<client#JohnZSmith>
   a foaf:Person;
   o:status o:ActiveCustomer;
   foaf:name "John Z. Smith".
<client#BettyASmith>
   a foaf:Person;
   o:status o:PreviousCustomer;
   foaf:name "Betty A. Smith".
 <client#BettyASmith>
   a foaf:Person;
   o:status o:PotentialCustomer;
   foaf:name "Joan R. Smith".

The server determines the size of the pages using application specific methods not defined within this specificiation. Note also, the actual name for the query parameter (such as ?p=2) is also defined by the server and not this specification.

The following example is the result of retrieving the representation for the next page:

Example 2
# The following is the representation of
#  http://example.org/customer-relations?p=2
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix o: <http://example.org/ontology/>.

<http://example.org/customer-relations>
   o:client <client#GlenWSmith>, <client#AlfredESmith>. 
 
<http://example.org/customer-relations?p=2>
   a ldp:Page;
   ldp:pageOf <http://example.org/customer-relations>;
   ldp:nextPage rdf:nil.

<client#GlenWSmith>
   a foaf:Person;
   o:status o:ActiveCustomer, o:GoldCustomer;
   foaf:name "Glen W. Smith".

<client#AlfredESmith>
   a foaf:Person;
   o:status o:ActiveCustomer, o:BronzeCustomer;
   foaf:name "Alfred E. Smith".

In this example, there are only two customers provided in the final page.  To indicate this is the last page, a value of rdf:nil is used for the ldp:nextPage predicate of the page resource.

4.10.2 HTTP GET

In addition to the requirements set forth in section 4.3 on HTTP GET, LDPR servers that support paging must also follow the requirements in this section

4.10.2.1 LDPR servers SHOULD allow clients to retrieve large LDPRs in pages. In responses to GET requests with an LDPR as the Request-URI, LDPR servers that support paging SHOULD provide an HTTP Link header whose target URI is the first page resource, and whose link relation type is first [RFC5988]. This is the mechanism by which clients discover the URL of the first page. If no such Link header is present, then conservative clients will assume that the LDPR does not support paging. For example, if there is a LDPR with URL <resourceURL> that supports paging and whose first page URL is <resourceURL>?theFirstPage, then the corresponding link header would be Link: <?theFirstPage>;rel="first". The representation for any page, including the first, will include the URL for the next page. See section 4.10 for additional details.
4.10.2.2 LDPR servers MAY split the response representation of any LDPR. This is known as server-initiated paging. See section 4.10 for additional details.
4.10.2.3 LDPR servers that initiate paging SHOULD respond to requests for a LDPR by redirecting the client to the first page resource using a 303 See Other response with an HTTP Location header providing the first page resource URL.
4.10.2.4 LDPR servers that support paging MUST include a representation for the page resource.
4.10.2.4.1 The page resource representation MUST have one triple with the subject of the page, predicate of ldp:nextPage and object being the URL for the subsequent page.
Example 3
<http://example.org/customer-relations?firstPage>
    ldp:nextPage  <http://example.org/customer-relations?p=2> .
4.10.2.4.2 The last page resource representation MUST have one triple with the subject of the last page, predicate of ldp:nextPage and object being rdf:nil.
Example 4
<http://example.org/customer-relations?p=2>
    ldp:nextPage  rdf:nil .
4.10.2.4.3 The page resource representation SHOULD have one triple to indicate its type, whose subject is the URL of the page, whose predicate is rdf:type and object is ldp:Page. It also SHOULD have 1 triple to indicate the resource it is paging, whose  subject is the URL of the page, predicate is ldp:pageOf, and object is the URL of the LDPR.
Example 5
<http://example.org/customer-relations?firstPage>
    rdf:type    ldp:Page;
    ldp:pageOf  <http://example.org/customer-relations>.

4.10.3 HTTP OPTIONS

4.10.3.1 LDPR servers MUST indicate their support for client-initiated paging by responding to a HTTP OPTIONS request on the LDPR’s URL with the HTTP response header for link relations using the header name of Link and link relation type first [RFC5988].

4.11 Resource Inlining: Representing Multiple Resources in a Response

Feature At Risk

The LDP Working Group proposes incorporation of the features described in this section.

  • The addition of resource inlining to save application latency and server/network load in controlled environments.

Feedback, both positive and negative, is invited by sending email to the mailing list in Status of This Document.

4.11.1 Introduction

This section is non-normative.

Servers whose resources are relatively granular may wish to optimistically provide more information in a response than what the client actually requested, in order to reduce the average number of client application HTTP flows. LDP provides some basic building blocks to enable this, that implementations can re-use to build complete solutions, and they may serve as complete solutions in applications with sufficient controls on resource content. These building blocks are resource inlining and member inlining.

LDP does not provide clients with any way to detect whether or not the server is capable of inlining (all its resources or any specific resource), nor does it provide clients with any way to influence which (if any) resources are inlined in any given response.

Servers can return extra triples on any response, but fail to meet the definition of resource inlining, by either returning a subset of the other resource(s) triples or by failing to assert that all triples were included (even through they were). Clients might still find the extra information useful, but the only way for clients to be sure they had all available information would be to make a HTTP GET request against all the other resource(s). In some applications, knowing that these requests are unnecessary saves significant latency and server/network load.

4.11.2 Use with Care

This section is non-normative.

The building blocks LDP provides can only be safely used if certain assumptions hold. Said another way, resource inlining solves a subset of scenarios, not all scenarios in the general case — so if you care about any of the following in a given application, your server should avoid returning any triples beyond those found at the HTTP Request-URI.

  • Provenance is lost: because RDF graphs from multiple HTTP resources are merged in the response without attributing each statement to its originating graph (i.e. without quotation), it is impossible for a client to reliably know which triples came from which HTTP resource(s). A general solution allowing quotation is RDF Datasets; that is expected to be standardized independently, and can be used in these cases once it is available.

  • The response may contain contradictions that are trivially obvious (or subtle), and those may or may not be a problem at the application level. For a trivial example, two triples may have identical subjects and predicates but different objects: "75F is too hot"; "75F is too cold". Again, quotation via RDF Datasets (or any equivalent mechanism) is believed to provide a long term solution once standardized.

4.11.3 HTTP GET

In addition to the requirements set forth in other sections, LDPR servers that support resource inlining must also follow the requirements in this section.

4.11.3.1 LDPR servers that support resource inlining MUST include a ldp:Page resource in the representation describing the set of inlined resources, whether or not the representation contains subsequent pages. The ldp:Page resource conceptually contains metadata about the representation; it is usually not part of the HTTP resource's state, and its presence does not indicate that the LDPR server supports paging in general. LDPR servers that include the ldp:Page resource for inlining and also support paging MUST use the same ldp:Page resource for the triples required by both, in order to minimize client code complexity. The ldp:Page resource's triples are the LDP-defined means by which the servers communicate to LDP clients the set of HTTP resources whose state is included in a representation, allowing clients to avoid HTTP GET requests for them.
4.11.3.2 LDPR servers that support resource inlining MUST include the ldp:Page resource described in section 4.11.3.1 one triple for each inlined resource, whose subject is the ldp:Page resource URI, whose predicate is ldp:inlinedResource, and whose object is the HTTP Request-URI of an inlined resource [HTTP11].
4.11.3.3 LDPR clients SHOULD avoid making HTTP GET requests against any resource whose HTTP Request-URI is the object of a triple of the form described in section 4.11.3.2, unless there are application-specific reasons for doing so. Clients should note that by the time the representation is received, the actual state of any inlined resource(s) may have changed due to subsequent requests.
4.11.3.4 LDPR clients MUST NOT assume that LDPR representations lacking a ldp:Page resource or lacking the triple described in section 4.11.3.2 contain all the triples for any resource(s) listed in the representation whose HTTP Request-URI differs from the HTTP Request-URI used by the client. The representation might in fact contain all such triples, or some subset of them, and that might or might not be completely adequate for the client's intended usage, but an LDP client has no way to discern from such a representation which interpretation is accurate.

5. Linked Data Platform Containers

5.1 Informative

This section is non-normative.

Many HTTP applications and sites have organizing concepts that partition the overall space of resources into smaller containers. Blog posts are grouped into blogs, wiki pages are grouped into wikis, and products are grouped into catalogs. Each resource created in the application or site is created within an instance of one of these container-like entities, and users can list the existing artifacts within one. Containers answer some basic questions, which are:

  1. To which URLs can I POST to create new resources?
  2. Where can I GET a list of existing resources?
  3. How is the order of the container entries expressed?
  4. How do I get information about the members along with the container?
  5. How can I ensure the resource data is easy to query?

This document defines the representation and behavior of containers that address these issues. The set of members of a container is defined by a set of triples in its representation (and state) called the membership triples. The membership triples of a container all have the same subject and predicate – the objects of the membership triples define the members of the container. The subject of the membership triples is called the membership subject and the predicate is called the membership predicate. In the simplest cases, the membership subject will be the LDPC resource itself, but it does not have to be. The membership predicate is also variable and will often be a predicate from the server application vocabulary or the rdfs:member predicate.

This document includes a set of guidelines for using POST to create new resources and add them to the list of members of a container. It goes on to explain how to learn about a set of related resources, they may have been created using POST or through other means. It also defines behavior when POST created resources are deleted, to clean up container membership, and deleting containers removes membership information and possibly perform some cleanup tasks on unreferenced member resources.

The following illustrates a very simple container with only three members and some information about the container (the fact that it is a container and a brief title):

Example 6
# The following is the representation of
#    http://example.org/container1/
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.

<>
   a ldp:Container;
   ldp:membershipSubject <>
   ldp:membershipPredicate rdfs:member;
   ldp:membershipObject ldp:MemberSubject;
   dcterms:title "A very simple container";
   rdfs:member <member1>, <member2>, <member3>.

This example is very straightforward - the membership predicate is rdfs:member and the membership subject is the container itself. A POST to this container will create a new resource and add it to the list of members by adding a new membership triple to the container.

Sometimes it is useful to use a subject other than the container itself as the membership subject and to use a predicate other than rdfs:member as the membership predicate. Let's start with a domain resource for a person's net worth, as illustrated below:

Example 7
# The following is a partial representation of
#   http://example.org/netWorth/nw1
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix o: <http://example.org/ontology/>.
<>
   a o:NetWorth;
   o:netWorthOf <http://example.org/users/JohnZSmith>;
   o:asset 
      <assetContainer/a1>,
      <assetContainer/a2>;
   o:liability 
      <liabilityContainer/l1>,
      <liabilityContainer/l2>,
      <liabilityContainer/l3>.

From this example, there is a rdf:type of o:NetWorth indicating the resource represents an instance of a person's net worth and o:netWorthOf predicate indicating the associated person. There are two sets of same-subject, same-predicate pairings; one for assets and one for liabilities. It would be helpful to be able to associate these multi-valued sets using a URL for them to assist with managing these, this is done by associating containers with them as illustrated below:

Example 8
# The following is an elaborated representation of
#   http://example.org/netWorth/nw1/
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix o: <http://example.org/ontology/>.
<>
   a o:NetWorth;
   o:netWorthOf <http://example.org/users/JohnZSmith>;
   o:asset 
      <assetContainer/a1>,
      <assetContainer/a2>;
   o:liability 
      <liabilityContainer/l1>,
      <liabilityContainer/l2>,
      <liabilityContainer/l3>.

<assetContainer/>
   a ldp:Container;
   dcterms:title "The assets of JohnZSmith";
   ldp:membershipSubject <>;
   ldp:membershipPredicate o:asset;
   ldp:membershipObject ldp:MemberSubject.

<liabilityContainer/>
   a ldp:Container;
   dcterms:title "The liabilities of JohnZSmith";
   ldp:membershipSubject <>;
   ldp:membershipPredicate o:liability;
   ldp:membershipObject ldp:MemberSubject.

The essential structure of the container is the same, but in this example, the membership subject is not the container itself – it is a separate net worth resource. The membership predicates are o:asset and o:liability – predicates from the domain model. A POST of an asset representation to the asset container will create a new asset and add it to the list of members by adding a new membership triple to the container. You might wonder why http://example.org/netWorth/nw1 isn't made a container itself and POST the new asset directly there. That would be a fine design if http://example.org/netWorth/nw1 had only assets, but if it has separate predicates for assets and liabilities, that design will not work because it is unspecified to which predicate the POST should add a membership triple. Having separate http://example.org/netWorth/nw1/assetContainer/ and http://example.org/netWorth/nw1/liabilityContainer/ container resources allows both assets and liabilities to be created.

Example 9
# The following is the representation of
#   http://example.org/netWorth/nw1/assetContainer/
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix o: <http://example.org/ontology/>.

<>
   a ldp:Container;
   ldp:membershipSubject <http://example.org/netWorth/nw1>;
   ldp:membershipPredicate o:asset;
   ldp:membershipObject ldp:MemberSubject.

<http://example.org/netWorth/nw1>
   a o:NetWorth;
   o:asset <a1>, <a2>.

In this example, clients cannot simply guess which resource is the membership subject and which predicate is the membership predicate, so the example includes this information in triples whose subject is the LDPC resource itself.

5.1.1 Container Member Information

In many – perhaps most – applications involving containers, it is desirable for the client to be able to get information about each container member without having to do a GET on each one. LDPC allows servers to include this information directly in the representation of the container. The server decides the amount of data about each member that is provided. Some common strategies include providing a fixed number of standard properties, or providing the entire RDF representation of each member resource, or providing nothing. The server application domain and its use-cases will determine how much information is required.

Continuing on from the net worth example, there will be additional triples for the member resources (assets) in the representation:

Example 10
# The following is the representation of
#	 http://example.org/netWorth/nw1/assetContainer/
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix ldp:      <http://www.w3.org/ns/ldp#>.
@prefix o:       <http://example.org/ontology/>.

<>
   a ldp:Container;
   dcterms:title "The assets of JohnZSmith";
   ldp:membershipSubject <http://example.org/netWorth/nw1>;
   ldp:membershipPredicate o:asset;
   ldp:membershipObject ldp:MemberSubject.

<http://example.org/netWorth/nw1>
   a o:NetWorth;
   o:asset <a1>, <a3>, <a2>.

<a1>
   a o:Stock;
   o:value 10000.
<a2>
   a o:Bond;
   o:value 20000.
<a3>
   a o:RealEstateHolding;
   o:value 300000.

In a similar manner, when the representation for the resource of asset .../<a1> is returned a server may include the membership triple of the form (.../nw1, o:asset, .../a1).

5.1.2 Retrieving Only Non-member Properties

The representation of a container that has many members will be large. There are several important cases where clients need to access only the non-member properties of the container. Since retrieving the whole container representation to get this information may be onerous for clients and cause unnecessary overhead on servers, it is desired to define a way to retrieve only the non-member property values. Defining for each LDPC a corresponding resource, called the “non-member resource”, whose state is a subset of the state of the container, does this.

The example listed here only show a simple case where only a few simple non-member properties are retrieved. In real world situations more complex cases are likely, such as those that add other predicates to containers, for example providing validation information and associating SPARQL endpoints. [SPARQL-QUERY]

Here is an example requesting the non-member properties of a container identified by the URL http://example.org/container1/. In this case, the non-member resource is identified by the URL http://example.org/container1?non-member-properties:

Request:

Example 11
GET /container1?non-member-properties HTTP/1.1
Host: example.org
Accept: text/turtle; charset=UTF-8

Response:

Example 12
HTTP/1.1 200 OK
Content-Type: text/turtle; charset=UTF-8
ETag: "_87e52ce291112"
Content-Length: 325

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.

<http://example.org/container1/>
   a ldp:Container;
   dcterms:title "A Linked Data Platform Container of Acme Resources";
   ldp:membershipSubject http://example.org/container1/;
   ldp:membershipPredicate rdfs:member;
   ldp:membershipObject ldp:MemberSubject;
   dcterms:publisher <http://acme.com/>.

While the same non-member resource could be used to update the non-member properties via PUT, LDP recommends using PATCH for this purpose.

5.1.3 Ordering

There are many cases where an ordering of the members of the container is important. LDPC does not provide any particular support for server ordering of members in containers, because any client can order the members in any way it chooses based on the value of any available property of the members. In the example below, the value of the o:value predicate is present for each member, so the client can easily order the members according to the value of that property. In this way, LDPC avoids the use of RDF constructs like Seq and List for expressing order.

Order becomes more important for LDPC servers when containers are paginated. If the server does not respect ordering when constructing pages, the client would be forced to retrieve all pages before sorting the members, which would defeat the purpose of pagination. In cases where ordering is important, an LDPC server exposes all the members on a page with the proper sort order with relation to all members on the next and previous pages. When the sort is ascending, all the members on a current page have a higher sort order than all members on the previous page and lower sort order than all the members on the next page. When the sort is descending, the opposite order is used. Since more than one value may be used to sort members, the LDPC specification allows servers to assert the ordered list of sort criteria used to sort the members, using the ldp:containerSortCriteria relation. Each member of the ordered list exposes one ldp:containerSortCriterion, consisting of a ldp:containerSortOrder, ldp:containerSortPredicate, and optionally a ldp:containerSortCollation.

Here is an example container described previously, with representation for ordering of the assets:

Example 13
# The following is the ordered representation of
#   http://example.org/netWorth/nw1/assetContainer/
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix o: <http://example.org/ontology/>.

<>
   a ldp:Container;
   dcterms:title "The assets of JohnZSmith";
   ldp:membershipSubject <http://example.org/netWorth/nw1>;
   ldp:membershipPredicate o:asset;
   ldp:membershipObject ldp:MemberSubject.

<?firstPage>
   a ldp:Page;
   ldp:pageOf <>;
   ldp:containerSortCriteria (#SortValueAscending).

<#SortValueAscending>
   a ldp:ContainerSortCriterion;
   ldp:containerSortOrder ldp:Ascending;
   ldp:containerSortPredicate o:value.

<http://example.org/netWorth/nw1>
   a o:NetWorth;
   o:asset <a1>, <a3>, <a2>.

<a1>
   a o:Stock;
   o:value 100.00.
<a2>
   a o:Cash;
   o:value 50.00.
<a3>
   a o:RealEstateHolding;
   o:value 300000.

As you can see by the addition of the ldp:ContainerSortCriteria predicate, the o:value predicate is used to order the page members in ascending order.  It is up to the domain model and server to determine the appropriate predicate to indicate the resource’s order within a page, and up to the client receiving this representation to use that order in whatever way is appropriate, for example to sort the data prior to presentation on a user interface.

5.2 General

The Linked Data Platform does not define how clients discover LDPCs.

5.2.1 LDPC servers MUST also be conformant LDPR servers. A Linked Data Platform Container MUST also be a conformant Linked Data Platform Resource.
5.2.2 LDPC membership is not exclusive; this means that the same resource (LDPR or not) which is identified by its canonical URI, MAY be a member of more than one LDPC.
5.2.3 The state of an LDPC includes information about which resources are its members. In the simplest cases, the membership subject will be the LDPC resource itself, but it does not have to be. The membership predicate is also variable and will often be a predicate from the server application vocabulary. If there is no obvious predicate from the server application vocabulary to use, LDPC servers SHOULD use the rdfs:member predicate. Member resources can be any kind of resource identified by its URI, LDPR or otherwise.
5.2.4 An LDPC representation MUST contain exactly one triple whose subject is the LDPC URI, whose predicate is the ldp:membershipSubject, and whose object is the LDPC's membership subject URI.
5.2.5 An LDPC representation MUST contain exactly one triple whose subject is the LDPC URI, and whose predicate is either ldp:membershipPredicate or ldp:membershipPredicateInverse. The object of the triple is constrained by other sections, such as 5.2.5.1 or 5.2.5.2.
5.2.5.1 For a given triple T with a subject C of the LDPC and predicate of ldp:membershipPredicate, the object MUST be the URI of the membership predicate P used to indicate membership to the linked to LDPC, or simply: T = ( C, ldp:membershipPredicate, P). For the membership predicate URI object used in the triple T, it would be found in a resource's same subject R and same predicate P membership triples of the form: (R, P, MR), where MR represents URI of a member resource.
5.2.5.2 For a given triple T with a subject C of the LDPC and predicate of ldp:membershipPredicateInverse, the object MUST be the URI of the membership predicate P used to indicate membership to the linked to LDPC, or simply: T = ( C, ldp:membershipPredicateInverse, P). For the membership predicate URI object used in the triple T, it would be found in a resource's object subject R and same predicate P membership triples of the form: (MR, P, R), where MR represents URI of a member resource.
5.2.6 The representation of a LDPC MAY include an arbitrary number of additional triples whose subjects are the members of the container, or that are from the representations of the members (if they have RDF representations). This allows a LDPC server to provide clients with information about the members without the client having to do a GET on each member individually. See sections 5.1.1 Container Member Information, section 4.11 , and section 5.10 for additional details.
5.2.7 The representation of a LDPC MUST have rdf:type of ldp:Container, but it MAY have additional rdf:types.
5.2.8 LDPC representations SHOULD NOT use RDF container types rdf:Bag, rdf:Seq or rdf:List.
5.2.9 LDPC servers SHOULD NOT re-use URIs, regardless of the mechanism by which members are created (POST, PUT, etc.). Certain specific cases exist where a LDPC server MAY delete a resource and then later re-use the URI when it identifies the same resource, but only when consistent with Web architecture [WEBARCH]. While it is difficult to provide absolute implementation guarantees of non-reuse in all failure scenarios, re-using URIs creates ambiguities for clients that are best avoided.
5.2.10 Some LDPCs have membership objects that are not directly URIs minted upon LDPC member creation, for example URIs with non-empty fragment identifier [RFC3986]. To determine which object URI to use for the membership triple, LDPCs MUST contain one triple whose subject is the LDPC URI, predicate is ldp:membershipObject, with an object MO. Where MO and the HTTP URI R from POST create (as found in HTTP response Location header) can be used to locate a triple of the form: (R, MO, N) and where N can be used to construct the membership triple of the form: (membership subject, membership predicate, N). When ldp:membershipPredicateInverse is used instead of ldp:membershipPredicate, the membership triple MUST be of the form: (N, membership predicate, membership subject). To indicate that the member resource URI is the membership object (the default or typical case), the object MUST be set to predefined URI ldp:MemberSubject such that it forms the triple: (LDPC URI, ldp:membershipObject, ldp:MemberSubject).

5.3 HTTP GET

5.3.1 The representation of a LDPC MUST contain a set of triples with a consistent subject and predicate whose objects indicate members of the container. The subject of the triples MAY be the container itself or MAY be another resource (as in the example).  See also 5.2.3.
5.3.2 LDPC servers MAY represent the members of a paged LDPC in a sequential order.  If the server does so, it MUST be specify the order using a triple whose subject is the page URI, whose predicate is ldp:containerSortCriteria, and whose object is a rdf:List of ldp:containerSortCriterion resources. The resulting order MUST be as defined by SPARQL SELECT’s ORDER BY clause [SPARQL-QUERY]. Sorting criteria MUST be the same for all pages of a representation; if the criteria were allowed to vary, the ordering among members of a container across pages would be undefined. The first list entry provides the primary sorting criterion, any second entry provides a secondary criterion used to order members considered equal according to the primary criterion, and so on. See section 5.1.4 Ordering for an example.
5.3.3 LDPC page representations ordered using ldp:containerSortCriteria MUST contain, in every ldp:containerSortCriterion list entry, a triple whose subject is the sort criterion identifier, whose predicate is ldp:containerSortPredicate and whose object is the predicate whose value is used to order members between pages (the page-ordering values). The only predicate data types whose behavior LDP constrains are those defined by SPARQL SELECT’s ORDER BY clause [SPARQL-QUERY]. Other data types can be used, but LDP assigns no meaning to them and interoperability will be limited.
5.3.4 LDPC page representations ordered using ldp:containerSortCriteria MUST contain, in every ldp:containerSortCriterion list entry, a triple whose subject is the sort criterion identifier, whose predicate is ldp:containerSortOrder and whose object describes the order used. LDP defines two values, ldp:Ascending and ldp:Descending, for use as the object of this triple. Other values can be used, but LDP assigns no meaning to them and interoperability will be limited.
5.3.5 LDPC page representations ordered using ldp:containerSortCriteria MAY contain, in any ldp:containerSortCriterion list entry, a triple whose subject is the sort criterion identifier, whose predicate is ldp:containerSortCollation and whose object identifies the collation used. LDP defines no values for use as the object of this triple. While it is better for interoperability to use open standardized values, any value can be used. When the ldp:containerSortCollation triple is absent and the page-ordering values are strings or simple literals [SPARQL-QUERY], the resulting order is as defined by SPARQL SELECT’s ORDER BY clause [SPARQL-QUERY] using two-argument fn:compare, that is, it behaves as if http://www.w3.org/2005/xpath-functions/collation/codepoint was the specified collation. When the ldp:containerSortCollation triple is present and the page-ordering values are strings or simple literals [SPARQL-QUERY], the resulting order is as defined by SPARQL SELECT’s ORDER BY clause [SPARQL-QUERY] using three-argument fn:compare, that is, the specified collation. The ldp:containerSortCollation triple SHOULD be omitted for comparisons involving page-ordering values for which [SPARQL-QUERY] does not use collations.

5.4 HTTP POST

This specification imposes the following new requirements on HTTP POST for LDPCs only when an LDPC supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

5.4.1 LDPC clients SHOULD create member resources by submitting a representation as the entity body of the HTTP POST to a known LDPC. If the resource was created successfully, LDPC servers MUST respond with status code 201 (Created) and the Location header set to the new resource’s URL. Clients shall not expect any representation in the response entity body on a 201 (Created) response.
5.4.2 After a successful HTTP POST request to a LDPC, the new resource MUST appear as a member of the LDPC until the new resource is deleted or removed by other methods. An LDPC MAY also contain resources that were added through other means - for example through the user interface of the site that implements the LDPC.
5.4.3 LDPC servers MAY accept an HTTP POST of non-RDF representations for creation of any kind of resource, for example binary resources. See 5.4.13 for introspection details.
5.4.4 For servers that support create, LDPC servers MUST create an LDPR from a RDF representation in the request entity body. The newly created LDPR could also be a LDPC, therefore servers MAY allow the creation of LDPCs within a LDPC.
5.4.5 LDPC servers MUST accept a request entity body with a request header of Content-Type with value of text/turtle [TURTLE].
5.4.6 LDPC servers SHOULD use the Content-Type request header to determine the representation format when the request has an entity body. When the header is absent, LDPC servers MAY infer the content type by inspecting the entity body contents [HTTP11].
5.4.7 In RDF representations, LDPC servers MUST interpret the null relative URI for the subject of triples in the LDPR representation in the request entity body as referring to the entity in the request body. Commonly, that entity is the model for the “to be created” LDPR, so triples whose subject is the null relative URI will usually result in triples in the created resource whose subject is the created resource.  
5.4.8 LDPC servers SHOULD assign the subject URI for the resource to be created using server application specific rules in the absence of a client hint.
5.4.9 LDPC servers SHOULD allow clients to create new resources without requiring detailed knowledge of application-specific constraints. This is a consequence of the requirement to enable simple creation and modification of LPDRs.
5.4.10 LDPC servers MAY allow clients to suggest the URI for a resource created through POST, using the HTTP Slug header as defined in [RFC5023]. LDP adds no new requirements to this usage, so its presence functions as a client hint to the server providing a desired string to be incorporated into the server's final choice of resource URI.
5.4.11 LDPC servers that allow member creation via POST SHOULD NOT re-use URIs, per the general requirements on LDPCs.
5.4.12 Upon successful creation of a non-RDF and therefore non-LDPR member (HTTP status code of 201-Created and URI indicated by Location response header), LDPC servers MAY create an associated LDPR to contain data about the created resource. If an LDPC server creates this associated LDPR it MUST indicate its location on the HTTP response using the HTTP response header Link and relationship type meta and href to be the URI of the meta-resource [RFC5988].
5.4.13 LDPC servers that support POST MUST include an Accept-Post response header on HTTP OPTIONS responses, listing post document media type(s) supported by the server. LDP only specifies the use of POST for the purpose of creating new resources, but a server can accept POST requests with other semantics. While "POST to create" is a common interaction pattern, LDP clients are not guaranteed, even when making requests to an LDP server, that every successful POST request will result in the creation of a new resource; they must rely on out of band information for knowledge of which POST requests, if any, will have the "create new resource" semantics. This requirement on LDP servers is intentionally stronger than the one levied in the header registration; it is unrealistic to expect all existing resources that support POST to suddenly return a new header or for all new specifications constraining POST to be aware of its existence and require it, but it is a reasonable requirement for new specifications such as LDP.
5.4.14 LDPCs that create new member resources MAY add triples to the container as part of member creation to reflect its factory role. LDP defines the ldp:created predicate for this purpose. An LDPC that tracks members created through the LDPC MUST add a triple whose subject is the container's URI, whose predicate is ldp:created, and whose object is the newly created member resource's URI; it MAY add other triples as well.

5.5 HTTP PUT

This specification imposes the following new requirements on HTTP PUT for LDPCs only when an LDPC supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

5.5.1 LDPC servers SHOULD NOT allow HTTP PUT to update a LDPC’s membership triples; if the server receives such a request, it SHOULD respond with a 409 (Conflict) status code.
5.5.2 LDPC servers MAY allow updating LDPC non-membership properties using HTTP PUT on a corresponding non-member resource, which MAY exclude server-managed properties such as ldp:membershipSubject, ldp:membershipPredicate and ldp:membershipPredicateInverse. The section 5.9 describes the process by which clients use HTTP OPTIONS to discover whether the server offers such a resource, and if so its URL.
5.5.3 LDPC servers SHOULD NOT allow HTTP PUT requests with inlined member information in the request representation. See section 5.1.1 Container Member Information for additional details.
5.5.4 LDPC servers that allow member creation via PUT SHOULD NOT re-use URIs, per the general requirements on LDPCs.

5.6 HTTP DELETE

This specification imposes the following new requirements on HTTP DELETE for LDPRs and LDPCs only when a LDPC supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

5.6.1 When a LDPC member resource originally created by the LDPC (for example, one whose representation was HTTP POSTed to the LDPC and then referenced by a membership triple) is deleted, and the LDPC server is aware of the member's deletion (for example, the member is managed by the same server), the LDPC server MUST also remove it from the LDPC by removing the corresponding membership triple.
5.6.2 When the LDPC server successfully completes the DELETE request on a LDPC, it MUST remove any membership triples associated with the LDPC as indicated by the canonical Request-URI. The LDPC server MAY perform additional removal of member resources. For example, the server could perform additional cleanup tasks for resources it knows are no longer referenced or have not been accessed for some period of time.
5.6.3 When the conditions in 5.6.1 hold, and the LDPC tracks member resources that it created using the ldp:created predicate, the LDPC server MUST also remove the deleted member's ldp:created triple.
5.6.4 When a LDPC member resource originally created by the LDPC (for example, one whose representation was HTTP POSTed to the LDPC and then referenced by a membership triple) is deleted, and the LDPC server created an associated LDPR (see 5.4.12), the LDPC server must also remove the associated LDPR it created.

5.7 HTTP HEAD

Note that certain LDP mechanisms, such as paging, rely on HTTP headers, and HTTP generally requires that HEAD responses include the same headers as GET responses. Also LDPC servers must also include HTTP headers on response to OPTIONS, see . Thus, implementers supporting HEAD should also carefully read the section 5.3 and section 5.9 .

5.8 HTTP PATCH

This specification imposes the following new requirements on HTTP PATCH for LDPCs only when a LDPC supports that method. This specification does not impose any new requirement to support that method, and [HTTP11] makes it optional.

5.8.1 LDPC servers are RECOMMENDED to support HTTP PATCH as the preferred method for updating LDPC non-membership properties.

5.9 HTTP OPTIONS

This specification imposes the following new requirements on HTTP OPTIONS for LDPCs.

5.9.1 LDPC servers SHOULD define a corresponding non-member resource to support requests for information about a LDPC without retrieving a full representation including all of its members; see section 5.1.2 Retrieving Only Non-member Properties for examples. In responses to OPTIONS requests with an LDPC as the Request-URI, LDPC servers that define a non-member resource SHOULD provide an HTTP Link header whose target URI is the non-member resource, and whose link relation type is http://www.w3.org/ns/ldp#nonMemberResource [RFC5988]. This is the mechanism by which clients discover the URL of the non-member resource. If no such Link header is present, then conservative clients will assume that the LDPC does not have a corresponding non-member resource. For example, if there is a LDPC with URL <containerURL> whose corresponding non-member resource URL is <containerURL>?nonMemberProperties, then the corresponding link header would be Link: <?nonMemberProperties>;rel="http://www.w3.org/ns/ldp#nonMemberResource"
5.9.2 When a LDPC creates a non-LDPR (e.g. binary) member (for example, one whose representation was HTTP POSTed to the LDPC and then referenced by a membership triple) it might create an associated LDPR to contain data about the non-LDPR (see 5.4.12). For non-LDPRs that have this associated LDPR, an LDPC server MUST provide an HTTP Link header whose target URI is the associated LDPR, and whose link relation type is meta [RFC5988].

5.10 Member Inlining: Returning All of a Container Page's Members in a Response

Feature At Risk

The LDP Working Group proposes incorporation of the features described in this section.

  • The addition of resource inlining to save application latency and server/network load in controlled environments.

Feedback, both positive and negative, is invited by sending email to the mailing list in Status of This Document.

5.10.1 Introduction

This section is non-normative.

One of the most commonly cited scenarios for resource inlining is to save clients enumerating a container of m members from having to perform m+1 HTTP requests (or m+p, if the container is paged into p pages). The desire is to allow the server to reduce the number of HTTP round-trips by returning some (perhaps all) members' content as part of the container's representation. In addition to the general resource inlining mechanism useful in cases where only a subset of the members' content is inlined, LDP also provides a predicate for the special case where all of a container's or page's members are inlined. Rather than forcing the server to add a triple for each inlined member, forcing clients to compare the list of inlined members against the set of members in the representation, and enlarging the representation needlessly, a single triple can be used. This is called member inlining.

LDP does not provide clients with any way to detect whether or not the server is capable of resource inlining (all its resources or any specific resource), nor does it provide clients with any way to influence which (if any) resources are inlined in any given response.

The inlining building blocks LDP provides can only be safely used if certain assumptions hold. This is no less true for containers than for LDPRs in general. See the general cautions on resource inlining.

5.10.2 HTTP GET

In addition to the requirements set forth in other sections, LDPC servers that support member inlining, and LDP clients aware of the same facility, must also follow the requirements in this section.

5.10.2.1 LDPC representations that are member inlined MUST include a ldp:Page resource in the representation, whether or not the representation contains multiple pages, as described in section 4.11.3.1. In addition to satisfying those requirements, the representation MUST contain a triple whose subject is the ldp:Page resource URI, whose predicate is ldp:membersInlined, and whose object is "true"^^xsd:boolean. This is means by which the server communicates to LDP clients that they can avoid HTTP GET requests for the members listed on the page.
5.10.2.2 LDPC clients SHOULD avoid making HTTP GET requests against any members in a LDPC representation containing a ldp:Page resource with the triple described in section 5.10.2.1, unless there are application-specific reasons for doing so. Clients should note that by the time the representation is received, the actual state of inlined members may have changed due to subsequent requests.
5.10.2.3 LDPC clients MUST NOT assume that LDPC representations lacking a ldp:Page resource or lacking the triple described in section 5.10.2.1 contain all the triples for all members listed in the representation. The representation might in fact contain all those triples, or some subset of them, that might or might not be completely adequate for the client's intended usage, but an LDP client has no way to discern from such a representation which interpretation is accurate.

6. HTTP Header Definitions

6.1 The Accept-Post Response Header

Feature At Risk

The LDP Working Group proposes incorporation of the features described in this section.

  • The addition of Accept-Post in this specification is pending advancement of an IETF draft that would fully include it, see [RFC5789]. Once LDP is in Candidate Recommendation, the LDP WG will make an assessment based on the status at IETF working with the W3C Director.

This specification introduces a new HTTP response header Accept-Post used to specify the document formats accepted by the server on HTTP POST requests. It is modeled after the Accept-Patch header defined in [RFC5789].

6.1.1 The syntax for Accept-Post, using the ABNF syntax defined in Section 2.1 of [HTTP11], is:
Accept-Post = "Accept-Post" ":" 1#media-type

The Accept-Post header specifies a comma-separated list of media- types (with optional parameters) as defined by [HTTP11], Section 3.7.

6.1.2 The Accept-Post HTTP header SHOULD appear in the OPTIONS response for any resource that supports the use of the POST method. The presence of the Accept-Post header in response to any method is an implicit indication that POST is allowed on the resource identified by the Request-URI. The presence of a specific document format in this header indicates that that specific format is allowed on POST requests to the resource identified by the Request-URI.
6.1.3 IANA Registration Template

The Accept-Post response header must be added to the permanent registry (see [RFC3864]).

Header field name: Accept-Post

Applicable Protocol: HTTP

Author/Change controller: W3C

Specification document: this specification

A. Acknowledgements

This section is non-normative.

The following people have been instrumental in providing thoughts, feedback, reviews, content, criticism and input in the creation of this specification:

Tim Berners-Lee, Steve Battle, Olivier Berger, Alexandre Bertails, Reza B'Far, Cody Burleson, Richard Cyganiak, Raúl García Castro, Miguel Esteban Gutiérrez, Sandro Hawke, Kingsley Idehen, Yves Lafon, Arnaud Le Hors, Antonis Loizou, Ashok Malhota, Roger Menday, Nandana Mihindukulasooriya, Kevin Page, Eric Prud'hommeaux, Andy Seaborne, Steve Speicher, Henry Story, Ted Thibodeau, Bart van Leeuwen, Miel Vander Sande, Ruben Verborgh, Serena Villata, Erik Wilde, David Wood, Martin P. Nally

B. References

B.1 Normative references

[DC-TERMS]
Dublin Core Metadata Initiative. Dublin Core Metadata Initiative Terms, version 1.1. 11 October 2010. DCMI Recommendation. URL: http://dublincore.org/documents/2010/10/11/dcmi-terms/.
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 Specification. 24 December 1999. W3C Recommendation. URL: http://www.w3.org/TR/html401
[HTTP11]
R. Fielding et al. Hypertext Transfer Protocol - HTTP/1.1. June 1999. RFC. URL: http://www.ietf.org/rfc/rfc2616.txt
[RDF-CONCEPTS]
Graham Klyne; Jeremy Carroll. Resource Description Framework (RDF): Concepts and Abstract Syntax. 10 February 2004. W3C Recommendation. URL: http://www.w3.org/TR/rdf-concepts/
[RDF-SCHEMA]
Dan Brickley; Ramanathan Guha. RDF Vocabulary Description Language 1.0: RDF Schema. 10 February 2004. W3C Recommendation. URL: http://www.w3.org/TR/rdf-schema
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Internet RFC 2119. URL: http://www.ietf.org/rfc/rfc2119.txt
[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. Registration Procedures for Message Header Fields. September 2004. RFC. URL: http://www.ietf.org/rfc/rfc3864.txt
[RFC3987]
M. Dürst; M. Suignard. Internationalized Resource Identifiers (IRIs). January 2005. RFC. URL: http://www.ietf.org/rfc/rfc3987.txt
[RFC4627]
D. Crockford. The application/json Media Type for JavaScript Object Notation (JSON) (RFC 4627). July 2006. RFC. URL: http://www.ietf.org/rfc/rfc4627.txt
[RFC5023]
J. Gregorio; B. de hOra. The Atom Publishing Protocol. October 2007. RFC. URL: http://www.ietf.org/rfc/rfc5023.txt
[RFC5789]
L Dusseault; J. Snell. PATCH Method for HTTP (RFC 5789). March 2010. RFC. URL: http://tools.ietf.org/html/rfc5789
[RFC5988]
Mark Nottingham. Web Linking (RFC 5988). October 2010. RFC. URL: http://www.ietf.org/rfc/rfc5988.txt
[RFC6585]
M. Nottingham; R. Fielding. Additional HTTP Status Codes. April 2012. RFC. URL: http://www.ietf.org/rfc/rfc6585.txt
[SPARQL-QUERY]
Eric Prud'hommeaux; Andy Seaborne. SPARQL Query Language for RDF. 15 January 2008. W3C Recommendation. URL: http://www.w3.org/TR/rdf-sparql-query/
[SPARQL-UPDATE]
Paul Gearon; Alexandre Passant; Axel Polleres. SPARQL 1.1 Update. 21 March 2013. W3C Recommendation. URL: http://www.w3.org/TR/sparql11-update/
[TURTLE]
David Beckett; Tim Berners-Lee. Turtle: Terse RDF Triple Language. January 2008. W3C Team Submission. URL: http://www.w3.org/TeamSubmission/turtle/

B.2 Informative references

[LINKED-DATA]
Tim Berners-Lee. Linked Data Design Issues. 27 July 2006. W3C-Internal Document. URL: http://www.w3.org/DesignIssues/LinkedData.html
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. Uniform Resource Identifier (URI): Generic Syntax (RFC 3986). January 2005. RFC. URL: http://www.ietf.org/rfc/rfc3986.txt
[WEBARCH]
Ian Jacobs; Norman Walsh. Architecture of the World Wide Web, Volume One. 15 December 2004. W3C Recommendation. URL: http://www.w3.org/TR/webarch/