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/