- From: Martynas Jusevičius <martynas@atomgraph.com>
- Date: Fri, 4 Mar 2022 20:54:49 +0100
- To: public-sparql-dev@w3.org
- Cc: Andy Seaborne <andy@apache.org>
Okay, I think I figured it out -- UNION helps to handle the case of length=1:
PREFIX : <http://example/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT DATA {
:x0 :p () .
:x1 :p (1) .
:x2 :p (1 2) .
:x3 :p (1 2 3) .
} ;
# The order here is important.
# Must do list >= 1 first.
# List of length >= 1
DELETE { ?elt rdf:rest rdf:nil }
INSERT { ?elt rdf:rest [ rdf:first 98 ; rdf:rest rdf:nil ] }
WHERE
{
?x :p ?list .
# List of length >= 1
{
?list rdf:rest rdf:nil .
BIND (?list AS ?elt)
}
UNION
{
?list rdf:rest+ ?elt .
?elt rdf:rest rdf:nil .
}
# ?elt is last cons cell
} ;
# List of length = 0
DELETE { ?x :p rdf:nil . }
INSERT { ?x :p [ rdf:first 99 ; rdf:rest rdf:nil ] }
WHERE
{
?x :p rdf:nil .
}
The result:
<http://example/x3> <http://example/p>
( 1 2 3 98 ) .
<http://example/x2> <http://example/p>
( 1 2 98 ) .
<http://example/x1> <http://example/p>
( 1 98 ) .
<http://example/x0> <http://example/p>
( 99 ) .
On Fri, Mar 4, 2022 at 7:56 PM Martynas Jusevičius
<martynas@atomgraph.com> wrote:
>
> Hi,
>
> I need to create a property with an rdf:List value, if the property
> doesn't exist, or append an item to the existing list.
>
> That seemed to exactly match the case "Add an element to the end of a
> list" in Andy's document "Updating RDF Lists with SPARQL":
> https://afs.github.io/rdf-lists-sparql#a-nameadd-lastaadd-an-element-to-the-end-of-a-list
>
> However, it didn't work in my case when the list length was equal to
> 1. Then I tried running the SPARQL update from the document on an
> empty Fuseki dataset and sure enough, it works for all cases except
> when the list length is 1. Here's the resulting dataset:
>
> <http://example/x3> <http://example/p>
> ( 1 2 3 98 ) .
>
> <http://example/x2> <http://example/p>
> ( 1 2 98 ) .
>
> <http://example/x1> <http://example/p>
> ( 1 ) .
>
> <http://example/x0> <http://example/p>
> ( 99 ) .
>
> I think this is due to the property path pattern ?list rdf:rest+ ?elt
> which does not match lists of length 1.
>
> Can someone confirm this and provide a complete version with a fix?
> The document should probably be updated, too.
>
> Thanks.
>
> Martynas
> atomgraph.com
Received on Friday, 4 March 2022 19:55:12 UTC