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,