Description
A certain level of SPARQL Update support is expected in Solid, to be used with the PATCH
method (#85). This discussion has begun, and this issue is to discuss some details that we need to decide upon.
The main questions are:
- What subset of SPARQL Update is suited as a minimal requirement for Solid?
- How does WAC apply to the minimal subset?
- How does WAC apply to SPARQL Update for implementations that will use a fully compliant SPARQL implementation?
- What would be the URI of SPARQL Endpoint(s)?
- Should any SPARQL Update operations be forbidden?
- Should complex HTTP Verbs rather be SPARQL operations?
A short overview of SPARQL Update
SPARQL Update has three operations that are of relevance to us, INSERT DATA
, DELETE DATA
, and INSERT
/DELETE
. SPARQL always operates over quads and quad patterns, whether they are quads that are passed directly as data to the two former operations, or used with the keywords WITH
and USING
to the INSERT
/DELETE
operation. In the context of Solid, each resource is represented with triples, and since the graph part is optional, we can safely ignore it for now.
INSERT DATA
takes triples in their curly brackets, and RDF merges the triples into the resource. DELETE DATA
deletes exactly the triples that it has in curly brackets if they exist. It is important to note that there are no variables with these two operations, so no pattern matching is going on. They are the simplest forms of SPARQL Update.
If pattern matching is required, i.e. you need variables, then those variables goes in a WHERE
clause, and thus, the more advanced INSERT
/DELETE
operation must be used.
Minimal SPARQL Update requirement
Quite clearly, the two operations INSERT DATA
and DELETE DATA
has some interesting properties, as supporting them does not require a query engine, it only requires that the RDF library can parse the queries, which are trivial since it is just triples, no patterns, and that it can perform an RDF Merge operation, and delete triples. The DELETE DATA
operation can't contained blank nodes, which also simplify. Moreover, since both operations can be performed in a single HTTP request, it can be implemented as an atomic operation with relative ease.
Once a WHERE
clause is added, for the more complex INSERT
/DELETE
operation, pretty much a full SPARQL engine with an almost complete larger parser and query planner is required.
Thus, a requirement to support INSERT DATA
and DELETE DATA
in a single HTTP PATCH request seems like an attractive option.
WAC as applied to Minimal SPARQL Update
INSERT DATA
seems clearly an acl:Append
operation, and DELETE DATA
is clearly a acl:Write
operation.
The question is if acl:Read
should also be required. Imagine a malicious user "Mallory": Mallory is authorized to write, but not to read, and does not particularly care if he destroys things, he just wants to check if certain triples were there. In that case, he can send the query
DELETE DATA {
<alice/profile#me> ex:age 14 .
}
The fear now would be that Mallory can figure out from the response that Alice was in fact 14 years old. With SPARQL as defined, this will have no effect, so it shouldn't be a problem. However, we have challenged this behaviour, so this may be a problem with Solid, that may be solved by requiring acl:Read
to be able to perform a DELETE DATA
operation.
The risk may be so remote that it isn't a real concern, but I think we need to discuss it.
WAC applied to SPARQL as a whole
Some implementations may have a full SPARQL Engine available and will wish to use it. For them, we need to define how WAC applies. As above, INSERT
is clearly an acl:Append
operation, DELETE
is clearly an acl:Write
operation, but with the caveat above, it may also be an acl:Read
operation. Whenever the WHERE
clause is added, acl:Read
would also be required. There is a long-term possibility that data could participate in the query without being exposed to the user, but lets only be concerned with the permission modes we currently have for now. Then, obviously, all the SPARQL read queries require acl:Read
.
SPARQL Endpoint
Historically, SPARQL has been queried through a server-wide SPARQL Endpoint, but the PATCH
use case typically makes every resource its own endpoint, and will only query data from that resource. This is a useful simplification, because it removes the need to use graph naming. This assumption may be relaxed in the future, but for now, I suggest we keep it that way.
Other SPARQL Update operations
SPARQL Update also defines operations LOAD
, CLEAR
, CREATE
, DROP
, COPY
, MOVE
and ADD
. We might need a brief note on what to do with them.
COPY
and MOVE
operations
The COPY use case has been proposed in #19 , and a possible solution could be to use the SPARQL Update COPY
operation instead of a protocol verb. Similar with MOVE
.
Forbidden SPARQL Update operations?
Most of the other operations maps trivially to HTTP methods as defined in Solid through LDP. It may be problematic to support them, as WAC must be applied in a consistent manner, and failure to do so may cause leaks. OTOH, those who have a full SPARQL engine may find it bothersome if they cannot use them. We need to define the behaviour.
Metadata
Metadata
Assignees
Type
Projects
Status