- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Sun, 11 Nov 2012 17:06:03 +0000
- To: semantic-web@w3.org
On 10/11/12 11:54, Melvin Carvalho wrote:
> Is there a pattern for incrementing a literal counter?
>
> Alice stores turtle in http://example.org/counter
>
> The initial operation should generate something like
>
> <#> <#counter> 1.
>
> Then the subsequent operation
>
> <#> <#counter> 2.
>
> And after that.
>
> <#> <#counter> 3.
>
> And so on ...
>
> Is there a neat way to do this in distributed way? SPARQL update?
> Maybe using Etags?
SPARQL Update:
DELETE { <#> <#counter> ?c1 }
INSERT { <#> <#counter> ?c2 }
WHERE { <#> <#counter> ?c1 .
BIND(?c1+1 AS ?c2) }
There are various ways to deal with the initial condition at the same time:
All in one operation:
DELETE { <#> <#counter> ?c1 }
INSERT { <#> <#counter> ?c2 }
WHERE {
OPTIONAL { <#> <#counter> ?c1 . }
BIND(COALESCE(?c1+1, 1) AS ?c2) }
where the assignment can also be written:
BIND(IF (BOUND(?c1) , ?c1+1 , 1) AS ?c2)
You can also use two operations in one request: (requests should be
atomic i.e the two operations together):
# Does a triple for the counter exist?
INSERT { <#> <#counter> 0 }
WHERE { FILTER NOT EXISTS { <#> <#counter> ?c } }
;
# Increment always - hence initialize to zero above
DELETE { <#> <#counter> ?c1 }
INSERT { <#> <#counter> ?c2 }
WHERE { <#> <#counter> ?c1 .
BIND(?c1+1 AS ?c2) }
Andy
Received on Sunday, 11 November 2012 17:06:32 UTC