You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Mark Hissink Muller <XM...@kombit.dk> on 2019/09/25 11:06:29 UTC
QueryParseException when creating a NQUADS-based UpdateRequest to add
a named model remotely
Hi all,
I encounter a strange QueryParseException when building my UpdateRequest to add a named model remotely from my Java client application.
I've progressed since my last question regarding inserts to a remote repository [1]. Thanks again Andy and Claude for your kind suggestions. Among other, I've understood that data insert calls should be directed at "http://[servername]/rdf4j-server/repositories/[repo_name]/statements". I've learned that a model should be serialized in NQUADS format into the request and that TURTLE does not work. Based on this, calling the server works well for dropping graphs and for inserting _unnamed_ models.
However, I am unable to insert data for a _named_ model/graph remotely. My approach - which fails when adding the serialized model to the UpdateRequest - is as follows.
...
// prepare the model we would like to load
Model model = prepareModel(..);
// create a dataset and add the model to it with a proper context
Dataset dataset = dataset = DatasetFactory.create();
dataset.addNamedModel(modelNameUri, model);
// serialise the dataset to an outputStream in NQUADS format
RDFDataMgr.write(outputStream, dataset, RDFFormat.NQUADS);
// build the full request by adding the prefix, the outputStream and the suffix
String insertDataRequest = "INSERT DATA { " + outputStream.toString() + "}";
UpdateRequest updateRequest = UpdateFactory.create(insertDataRequest);
// create the processor and fire off the request
UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemoteForm(updateRequest, postUrl);
updateProcessor.execute();
...
This code fails down in the UpdateFactory where a QueryParseException is thrown that tells that the fourth element (which is the model name / modelNameUri) is not expected. Strange thing is that the serialized NQUADS look ok.
When using an alternative approach and trying to build an request with an UpdateBuilder (as Claude suggested), I don't see how I can set the model name/uri for the model. It should be possible to add this either at creation or afterwards (rather than with every added triple), I presume…?
What is the recommended approach to add a named model...? Are there perhaps any examples...?
Much appreciated.
Best, Mark
[1] - https://jena.markmail.org/message/oxf5ff4bus67iim4
Re: QueryParseException when creating a NQUADS-based UpdateRequest to
add a named model remotely
Posted by Andy Seaborne <an...@apache.org>.
A better approach may be to use RDFConnection.
It has all the SPARQL operation including "send model"
Andy
On 25/09/2019 14:09, Andy Seaborne wrote:
> INSERT DATA does not take quads directly.
>
> The form is
>
> INSERT DATA { GRAPH <graph> { triples } }
>
> What *may* work is using Trig to insert.
>
> Andy
>
> On 25/09/2019 12:06, Mark Hissink Muller wrote:
>> Hi all,
>>
>> I encounter a strange QueryParseException when building my
>> UpdateRequest to add a named model remotely from my Java client
>> application.
>>
>> I've progressed since my last question regarding inserts to a remote
>> repository [1]. Thanks again Andy and Claude for your kind
>> suggestions. Among other, I've understood that data insert calls
>> should be directed at
>> "http://[servername]/rdf4j-server/repositories/[repo_name]/statements". I've
>> learned that a model should be serialized in NQUADS format into the
>> request and that TURTLE does not work. Based on this, calling the
>> server works well for dropping graphs and for inserting _unnamed_ models.
>>
>> However, I am unable to insert data for a _named_ model/graph
>> remotely. My approach - which fails when adding the serialized model
>> to the UpdateRequest - is as follows.
>>
>> ...
>> // prepare the model we would like to load
>> Model model = prepareModel(..);
>>
>> // create a dataset and add the model to it with a proper context
>> Dataset dataset = dataset = DatasetFactory.create();
>> dataset.addNamedModel(modelNameUri, model);
>>
>> // serialise the dataset to an outputStream in NQUADS format
>> RDFDataMgr.write(outputStream, dataset, RDFFormat.NQUADS);
>>
>> // build the full request by adding the prefix, the outputStream
>> and the suffix
>> String insertDataRequest = "INSERT DATA { " +
>> outputStream.toString() + "}";
>> UpdateRequest updateRequest =
>> UpdateFactory.create(insertDataRequest);
>>
>> // create the processor and fire off the request
>> UpdateProcessor updateProcessor =
>> UpdateExecutionFactory.createRemoteForm(updateRequest, postUrl);
>> updateProcessor.execute();
>> ...
>>
>> This code fails down in the UpdateFactory where a QueryParseException
>> is thrown that tells that the fourth element (which is the model name
>> / modelNameUri) is not expected. Strange thing is that the serialized
>> NQUADS look ok.
>>
>> When using an alternative approach and trying to build an request with
>> an UpdateBuilder (as Claude suggested), I don't see how I can set the
>> model name/uri for the model. It should be possible to add this either
>> at creation or afterwards (rather than with every added triple), I
>> presume…?
>>
>> What is the recommended approach to add a named model...? Are there
>> perhaps any examples...?
>>
>> Much appreciated.
>>
>> Best, Mark
>>
>> [1] - https://jena.markmail.org/message/oxf5ff4bus67iim4
>>
>>
Re: QueryParseException when creating a NQUADS-based UpdateRequest to
add a named model remotely
Posted by Martynas Jusevičius <ma...@atomgraph.com>.
This might help:
https://github.com/AtomGraph/Web-Client/blob/master/src/main/java/com/atomgraph/client/update/InsertDataBuilder.java#L80
Uses SPIN API.
On Wed, 25 Sep 2019 at 15.10, Andy Seaborne <an...@apache.org> wrote:
> INSERT DATA does not take quads directly.
>
> The form is
>
> INSERT DATA { GRAPH <graph> { triples } }
>
> What *may* work is using Trig to insert.
>
> Andy
>
> On 25/09/2019 12:06, Mark Hissink Muller wrote:
> > Hi all,
> >
> > I encounter a strange QueryParseException when building my UpdateRequest
> to add a named model remotely from my Java client application.
> >
> > I've progressed since my last question regarding inserts to a remote
> repository [1]. Thanks again Andy and Claude for your kind suggestions.
> Among other, I've understood that data insert calls should be directed at
> "http://[servername]/rdf4j-server/repositories/[repo_name]/statements".
> I've learned that a model should be serialized in NQUADS format into the
> request and that TURTLE does not work. Based on this, calling the server
> works well for dropping graphs and for inserting _unnamed_ models.
> >
> > However, I am unable to insert data for a _named_ model/graph remotely.
> My approach - which fails when adding the serialized model to the
> UpdateRequest - is as follows.
> >
> > ...
> > // prepare the model we would like to load
> > Model model = prepareModel(..);
> >
> > // create a dataset and add the model to it with a proper context
> > Dataset dataset = dataset = DatasetFactory.create();
> > dataset.addNamedModel(modelNameUri, model);
> >
> > // serialise the dataset to an outputStream in NQUADS format
> > RDFDataMgr.write(outputStream, dataset, RDFFormat.NQUADS);
> >
> > // build the full request by adding the prefix, the outputStream
> and the suffix
> > String insertDataRequest = "INSERT DATA { " +
> outputStream.toString() + "}";
> > UpdateRequest updateRequest =
> UpdateFactory.create(insertDataRequest);
> >
> > // create the processor and fire off the request
> > UpdateProcessor updateProcessor =
> UpdateExecutionFactory.createRemoteForm(updateRequest, postUrl);
> > updateProcessor.execute();
> > ...
> >
> > This code fails down in the UpdateFactory where a QueryParseException is
> thrown that tells that the fourth element (which is the model name /
> modelNameUri) is not expected. Strange thing is that the serialized NQUADS
> look ok.
> >
> > When using an alternative approach and trying to build an request with
> an UpdateBuilder (as Claude suggested), I don't see how I can set the model
> name/uri for the model. It should be possible to add this either at
> creation or afterwards (rather than with every added triple), I presume…?
> >
> > What is the recommended approach to add a named model...? Are there
> perhaps any examples...?
> >
> > Much appreciated.
> >
> > Best, Mark
> >
> > [1] - https://jena.markmail.org/message/oxf5ff4bus67iim4
> >
> >
>
Re: QueryParseException when creating a NQUADS-based UpdateRequest to
add a named model remotely
Posted by Andy Seaborne <an...@apache.org>.
INSERT DATA does not take quads directly.
The form is
INSERT DATA { GRAPH <graph> { triples } }
What *may* work is using Trig to insert.
Andy
On 25/09/2019 12:06, Mark Hissink Muller wrote:
> Hi all,
>
> I encounter a strange QueryParseException when building my UpdateRequest to add a named model remotely from my Java client application.
>
> I've progressed since my last question regarding inserts to a remote repository [1]. Thanks again Andy and Claude for your kind suggestions. Among other, I've understood that data insert calls should be directed at "http://[servername]/rdf4j-server/repositories/[repo_name]/statements". I've learned that a model should be serialized in NQUADS format into the request and that TURTLE does not work. Based on this, calling the server works well for dropping graphs and for inserting _unnamed_ models.
>
> However, I am unable to insert data for a _named_ model/graph remotely. My approach - which fails when adding the serialized model to the UpdateRequest - is as follows.
>
> ...
> // prepare the model we would like to load
> Model model = prepareModel(..);
>
> // create a dataset and add the model to it with a proper context
> Dataset dataset = dataset = DatasetFactory.create();
> dataset.addNamedModel(modelNameUri, model);
>
> // serialise the dataset to an outputStream in NQUADS format
> RDFDataMgr.write(outputStream, dataset, RDFFormat.NQUADS);
>
> // build the full request by adding the prefix, the outputStream and the suffix
> String insertDataRequest = "INSERT DATA { " + outputStream.toString() + "}";
> UpdateRequest updateRequest = UpdateFactory.create(insertDataRequest);
>
> // create the processor and fire off the request
> UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemoteForm(updateRequest, postUrl);
> updateProcessor.execute();
> ...
>
> This code fails down in the UpdateFactory where a QueryParseException is thrown that tells that the fourth element (which is the model name / modelNameUri) is not expected. Strange thing is that the serialized NQUADS look ok.
>
> When using an alternative approach and trying to build an request with an UpdateBuilder (as Claude suggested), I don't see how I can set the model name/uri for the model. It should be possible to add this either at creation or afterwards (rather than with every added triple), I presume…?
>
> What is the recommended approach to add a named model...? Are there perhaps any examples...?
>
> Much appreciated.
>
> Best, Mark
>
> [1] - https://jena.markmail.org/message/oxf5ff4bus67iim4
>
>