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);
                doUpdate(dataset);

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
--
Epimorphics Ltd (http://www.epimorphics.com) Epimorphics Ltd. is a limited company registered in England (number 7016688) Registered address: Court Lodge, 105 High Street, Portishead, Bristol BS20 6PT,

Reply via email to