On 24/09/13 09:48, Brian McBride wrote:
Is there an abstraction I can use that will allow me to execute sparql
updates on both local data stores and remote services over http?

I have a method that performs a sparql update.  Following [1]

it looks like this:

   void doUpdate(Dataset dataset) {
     String updateString = "..." ;
     GraphStore graphStore = GraphStoreFactory.create(dataset);
     UpdateAction.parseExecute(updateString, graphStore);
}

When called from a unit test I create the dataset as follows:

         final Dataset dataset = DatasetFactory.createMem();
        doUpdate(dataset);

The unit test works fine.

For the real use of the method, it needs to update a remote update
endpoint.  I'm currently, I suspect incorrectly, creating this as follows:

                 Dataset dataset = DatasetFactory.create(updateServiceIRI);

It fails here

                 doUpdate(dataset);

not here.


Caused by: org.apache.jena.atlas.web.HttpException: 400 - Attempt to perform 
SPARQL update by GET.  Use POST
    at org.apache.jena.riot.web.HttpOp.exec(HttpOp.java:1020)
    at org.apache.jena.riot.web.HttpOp.execHttpGet(HttpOp.java:291)
    at org.apache.jena.riot.web.HttpOp.execHttpGet(HttpOp.java:326)
    at org.apache.jena.riot.stream.LocatorURL.open(LocatorURL.java:46)
    at 
org.apache.jena.riot.stream.StreamManager.openNoMapOrNull(StreamManager.java:138)
    at 
org.apache.jena.riot.adapters.AdapterFileManager.readModelWorker(AdapterFileManager.java:292)
    at com.hp.hpl.jena.util.FileManager.readModel(FileManager.java:380)
    at 
com.hp.hpl.jena.sparql.util.DatasetUtils.addInGraphs(DatasetUtils.java:109)
    at 
com.hp.hpl.jena.sparql.util.DatasetUtils.createDataset(DatasetUtils.java:66)
    at 
com.hp.hpl.jena.sparql.util.DatasetUtils.createDataset(DatasetUtils.java:53)
    at com.hp.hpl.jena.query.DatasetFactory.create(DatasetFactory.java:177)
****
    at com.hp.hpl.jena.query.DatasetFactory.create(DatasetFactory.java:97)


The javadoc for DatasetFactory.create

    /** Create a dataset with a default graph and no named graphs
     *
     * @param uri   URIs merged to form the default dataset
     * @return Dataset
     */

It is reading in the remote URI into a local dataset. It will do a GET which is why you get that error message. You can't do SPARQL Update over HTTP GET (not that it is sending a legal SPARQL update)

It does not associate the dataset with the remote URI for update operations - and you can't do an update via GET.

UpdateExecutionFactory creates an "UpdateProcessor" that is a one-time operation on a dataset or service endpoint.

UpdateAction.parseExecute is a convenience packing of UpdateExecutionFactory/UpdateProcessor for local use.

        Andy


When this runs it throws the following exception:

org.springframework.web.util.NestedServletException: Request processing
failed; nested exception is org.apache.jena.atlas.web.HttpException: 400
- Attempt to perform SPARQL update by GET.  Use POST
     at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)

     at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
     at
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)

     at
org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:66)

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
     at
org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:168)

     at
org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:136)

     at
org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:134)
     at
com.pearson.taxonomy.cm.dataservices.controller.upload.TestServicesFileUploadController.testUpload(TestServicesFileUploadController.java:98)

     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

     at java.lang.reflect.Method.invoke(Method.java:601)
     at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

     at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

     at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)

     at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

     at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)

     at
org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)

     at
org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)

     at
org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)

     at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)

     at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)

     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
     at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)

     at
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)

     at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
     at
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)

     at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
     at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)

     at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

     at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

     at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

     at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

     at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

     at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: org.apache.jena.atlas.web.HttpException: 400 - Attempt to
perform SPARQL update by GET.  Use POST
     at org.apache.jena.riot.web.HttpOp.exec(HttpOp.java:1020)
     at org.apache.jena.riot.web.HttpOp.execHttpGet(HttpOp.java:291)
     at org.apache.jena.riot.web.HttpOp.execHttpGet(HttpOp.java:326)
     at org.apache.jena.riot.stream.LocatorURL.open(LocatorURL.java:46)
     at
org.apache.jena.riot.stream.StreamManager.openNoMapOrNull(StreamManager.java:138)

     at
org.apache.jena.riot.adapters.AdapterFileManager.readModelWorker(AdapterFileManager.java:292)

     at com.hp.hpl.jena.util.FileManager.readModel(FileManager.java:380)
     at
com.hp.hpl.jena.sparql.util.DatasetUtils.addInGraphs(DatasetUtils.java:109)
     at
com.hp.hpl.jena.sparql.util.DatasetUtils.createDataset(DatasetUtils.java:66)

     at
com.hp.hpl.jena.sparql.util.DatasetUtils.createDataset(DatasetUtils.java:53)

     at
com.hp.hpl.jena.query.DatasetFactory.create(DatasetFactory.java:177)
     at com.hp.hpl.jena.query.DatasetFactory.create(DatasetFactory.java:97)
     at
com.pearson.taxonomy.cm.dataservices.controller.upload.ServicesFileUploadController.handleFormUpload(ServicesFileUploadController.java:106)

     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

     at java.lang.reflect.Method.invoke(Method.java:601)
     at
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)

     at
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)

     at
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

     at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)

     at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)

     at
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

     at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)

     at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)

     at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)

     ... 40 more

The remote endpoint is a Fuseki server with the config given below. It
is up and running and other code is able to put graphs to it and query
those graphs.

# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0

## Example of a TDB dataset published using Fuseki:

@prefix :        <#> .
@prefix fuseki:  <http://jena.apache.org/fuseki#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .

[] rdf:type fuseki:Server ;
    # Timeout - server-wide default: milliseconds.
    # Format 1: "1000" -- 1 second timeout
    # Format 2: "10000,60000" -- 10s timeout to first result, then 60s
timeout to for rest of query.
    # See java doc for ARQ.queryTimeout
    # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue "10000" ] ;
    # ja:loadClass "your.code.Class" ;

    fuseki:services (
      <#service_tdb_all>
    ) .

# TDB
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

## ---------------------------------------------------------------
## Updatable TDB dataset with all services enabled.

<#service_tdb_all> rdf:type fuseki:Service ;
     rdfs:label                      "TDB Service (RW)" ;
     fuseki:name                     "cm" ;
     fuseki:serviceQuery             "query" ;
     fuseki:serviceQuery             "sparql" ;
     fuseki:serviceUpdate            "update" ;
     fuseki:serviceUpload            "upload" ;
     fuseki:serviceReadWriteGraphStore      "data" ;
     # A separate read-only graph store endpoint:
     fuseki:serviceReadGraphStore       "get" ;
     fuseki:dataset                   <#memDataset>;
     .

<#memDataset> rdf:type ja:RDFDataset ;
     tdb:unionDefaultGraph true
  .

Jena version: 2.11.1-SNAPSHOT
Fuseki version: 1.0.0

Am I using the right abstraction to access the remote update endpoint?
How should I do this?

Brian





[1] http://jena.apache.org/documentation/query/update.html

Reply via email to