- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Sun, 17 Mar 2013 16:16:16 +0000
- To: "public-ldp-wg@w3.org" <public-ldp-wg@w3.org>
ISSUE-17
-----
Another factor to consider is how patches are processed and how they
combine.
e.g. streaming
e.g. combining patches.
The abstract model covers this but the Trig documents don't follow the
model in a natural way.
Refined text for the model proposed.
-----
[[
The semantics of the PATCH model are based on SPARQL Update. Namely the
subset of SPARQL Update is limited to:
Subset of INSERT DATA
Subset of DELETE DATA
]]
but clarify that a SPARQL Update is a sequence of operations, performed
in the order give.
[[
A LDP-PATCH update is a sequence of changesteps, with each changestep
performed in the order in the sequence.
A changestep is either:
DELETE DATA (with no GRAPH)
INSERT DATA (with no GRAPH)
]]
== TriG documents
The TriG document approach dopes not fully reflect these semantics (the
original or refined text).
The advantage of the TriG-ish format is being about to reuse a general
parser. If addition restrictions are added to align to the model there
is, in effect, a new language, requiring a new parser to validate it so
the advantage of reusing TriG has been lost.
For example: combining two patches (any of the TriG suggestions has
these issues):
{ <> ldp:insert :g1 ; ldp:delete :g2 }
:g1 { ... }
:g2 { ... }
+
{ <> ldp:insert :g3 ; ldp:delete :g4 }
:g3 { ... }
:g4 { ... }
==> the concatenation as files is the same as:
{ <> ldp:insert :g1,g3 ; ldp:delete :g2,g4 }
:g1 { ... }
:g2 { ... }
:g3 { ... }
:g4 { ... }
which has lost the order of g2->g1->g4->g3 needed for changesets
(deletes and inserts don't freely mix).
Even the OSLC original version
oslc:deleteGraph {}
oslc:insertGraph {}
behaves differently in a merge (the ordering of deletes and inserts
changes).
And Trig does not say each name is used once:
oslc:deleteGraph {}
oslc:insertGraph {}
oslc:deleteGraph {}
oslc:insertGraph {}
will be legal TriG (but does not do delete-insert-delete-insert, it does
all deletes, then all inserts; it is not streamable).
== Streaming
Changes can be applied as received, not waiting for end of request.
The TriG format would require parsing the whole file before executing
because a processor must do all the deletes before the inserts but the
format does not require the deletes to be either contiguous or even
first in the file.
In the refined model, execution is more clearly in order received.
== Composition
If we have two patches, P1 and P2, then the TriG merge is not the same
as P1 then P2. Concatenating the documents is not the same as
performing one operation then the other (you have to sort out the bNode
labels - it's a text processing step, not a deep analysis of the operation).
Being able to combine patches is useful because we don't have
multi-operation transactions over HTTP. Consolidating a number of
patches together means you can ship around a single change unit that can
be applied atomically.
(c.g. a git or hg push - a number of commits in order)
== If TriG
if you want a TriG format, then
{ <> :changes ( <#del1> <#ins1> <#del2) ) }
<#del1> { ... }
<#del2> { ... } ## NB order of graphs does not matter
<#ins1> { ... }
nearly works (not streamable, concatenation does not work on lists).
Andy
Received on Sunday, 17 March 2013 16:16:50 UTC