- 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