On Mon, Feb 25, 2013 at 1:43 PM, Joshua TAYLOR <[email protected]> wrote:
> On Mon, Feb 25, 2013 at 11:42 AM, Joshua TAYLOR <[email protected]> wrote:
>> I'm looking at upgrading a project to use the new 2.10.0 release, and
>> things are coming along nicely so far (some possible hitches in some
>> writing code, but can't run tests until I can build...).  I've got a
>> bunch of cases of
>>
>> UpdateAction.execute(request, getModel(), binding);
>>
>> that don't compile, though;  according to the release notes [1],
>> "SPARQL Update execution no longer supports setting an initial
>> binding".  I'm going to keep looking for the new way to do this, but
>> in case someone's got the quick answer prepared, and so that the list
>> has a recorded answer, I figured I'd ask sooner rather than later:
>> how can initial bindings be specified in Jena 2.10.0?
>>
>> [1] http://svn.apache.org/repos/asf/jena/trunk/jena-arq/ReleaseNotes.txt
>
> After some lunch, and some searching, I've found discussion on the dev
> list about removing initial bindings [1] and that the accepted way to
> do this now is to use BIND or VALUES.   In our project, we've
> implemented a number of EnhancedResources that perform graph updates
> using an idiom where some SPARQL text refers to a ?this variable, and
> the execution uses a binding that binds ?this to the enhanced resource
> (which might not have a URI).   We'd much prefer to do the graph
> modification via SPARQL because it involves a number of operations,
> and we'd like to be able to use anonymous resources.  Here's a typical
> example:
>
>         static private final UpdateRequest setSomePropertyRequest =
> UpdateFactory.create(
>                 "DELETE {\n"+
>                  .... SPARQL code that uses variable ?this ...
>                 "} INSERT {\n"+
>                 "} WHERE {"+
>                    ...
>                 "}"
>         );
>
>         public Invocation setSomeProperty( Value value ) {
>                         final QuerySolutionMap binding = new 
> QuerySolutionMap();
>                         binding.add("?this", this );
>                         UpdateAction.execute( setSomePropertyRequest, 
> getModel(), binding);
>                 }
>                 return this;
>         }
>
> Is there still a way to do something like this?  If it will involve
> using VALUES or BIND, is there a way to make it work with blank nodes?
>
> Thanks in advance,
> //JT
>
> [1] 
> http://mail-archives.apache.org/mod_mbox/jena-dev/201302.mbox/%3CCAPTxtVNWT1HncCLom14cTF0WcjJ04pyP8ALes5Vb5yuSDv8DWw%40mail.gmail.com%3E

Sorry for so much noise, but I wonder if the following is a solution.
This does depend, of course, on the model against which the update is
run being on the same machine, and such.  If "this" has a URI, then I
can use the URI in the query, and if it's anonymous, then I can use
the Jena-specific-and-depending-on-local-data id.  Then I can use
request.add( "BIND ( ... as ?this )" ) to add the binding constraints
to the request.

                        final UpdateRequest request = UpdateFactory.create(); 
// ... more
query in real example
                        if ( this.isAnon() ) {
                                request.add( "BIND ( <_:"+this.getId()+"> as 
?thisInvocation )" );
                        }
                        else {
                                request.add( "BIND ( <_:"+this.getURI()+"> as 
?thisInvocation )" );
                        }
                        UpdateAction.execute( request, model ); // executes 
with the
requested binding

If this is a solution, it's easy enough to wrap cleanly in a util
method, and I'll be content with that.  Can anyone confirm or deny
that this is a solution?  (I'm hoping that I understand the
UpdateRequest#add( String ) method correctly.  The javadoc [1] is
empty, so I'm going on a guess...)

//JT

[1] 
http://jena.apache.org/documentation/javadoc/arq/com/hp/hpl/jena/update/UpdateRequest.html#add(java.lang.String)

-- 
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Reply via email to