On 03/01/2024 20:58, Dhamotharan, Kishan wrote:
Hi all,
We are attempting to upgrade from Jena 3.5 to Jena 4.10.0.
We are using “RDFConnection.connect(TDBFactory.createDataset());” for unit
tests.
The below query works totally fine in Jena 3.5 but fails with the following
exception in Jena 4.10.0.
I have confirmed that the query is correct and works totally fine in Neptune
RDF as well. Can you please help us on how to go about this ? or please suggest
if the query needs to updated to something else for jena 4.10.0.
If the update request works, try that exact string locally.
If that works, try converting the output of the UpdateBuilder to a
string, and parsing it back:
updateRequest = UpdateFactory.create(updateRequest.toString());
update(conn, updateRequest);
If that works, then there is a problem in the UpdateBuilder.
Whether that is in the way it is being used or a bug in the
UpdateBuilder itself isn't clear.
Reduce the test case to a simpler update.
> from Jena 3.5 to Jena 4.10.0.
It would helpful if you could bisect on the versions to identify which
version introduced the problem.
I have also attached the code sample to reproduce the issue.
The code does not compile. Is it an extrat of Groovy?
There is missing code and multiple syntax errors. It is very helpful to
have code that runs exactly without needing toi be fixed up because in
fixing it up, some assumption may be made that relates to the problem at
hand.
One example:
> private final graph1 = getNamedGraph()
Bad Java syntax 1. no ";" Is this because its Groovy?
Has other text also been lost? Groovy may be returnign a bad chocie of type.
Bad Java syntax 2. No type declaration - inserting bad data into a
builder can make it fail.
What's "getNamedGraph()"?
Ditto createURI()
Query :
INSERT {
GRAPH
<http://knowledge-store-test.amazon.com/b4a77401-9233-4115-b9db-dcbed33d73e2> {
<rdf:s1> <rdf:p1> "o1" .
}
}
WHERE
{ GRAPH
<http://knowledge-store-test.amazon.com/b4a77401-9233-4115-b9db-dcbed33d73e2>
{ <rdf:s2> <rdf:p2> <rdf:o2>}
GRAPH
<http://knowledge-store-test.amazon.com/8bfa2a32-f95e-476f-99e9-84b355bed6a2>
{ FILTER NOT EXISTS { <rdf:s3> <rdf:p3> "o3" }}
}
Error :
org.apache.jena.sparql.ARQInternalErrorException: compile(Element)/Not a
structural element: ElementFilter
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.broken(AlgebraGenerator.java:577)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileUnknownElement(AlgebraGenerator.java:170)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileElement(AlgebraGenerator.java:156)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileElementGraph(AlgebraGenerator.java:426)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileElement(AlgebraGenerator.java:133)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileOneInGroup(AlgebraGenerator.java:319)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileElementGroup(AlgebraGenerator.java:202)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compileElement(AlgebraGenerator.java:127)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compile(AlgebraGenerator.java:113)
at
app//org.apache.jena.sparql.algebra.AlgebraGenerator.compile(AlgebraGenerator.java:100)
at app//org.apache.jena.sparql.algebra.Algebra.compile(Algebra.java:73)
at
app//org.apache.jena.sparql.engine.QueryEngineBase.createOp(QueryEngineBase.java:140)
at
app//org.apache.jena.sparql.engine.QueryEngineBase.<init>(QueryEngineBase.java:57)
at
app//org.apache.jena.sparql.engine.main.QueryEngineMain.<init>(QueryEngineMain.java:45)
at
app//org.apache.jena.tdb.solver.QueryEngineTDB.<init>(QueryEngineTDB.java:63)
at
app//org.apache.jena.tdb.solver.QueryEngineTDB$QueryEngineFactoryTDB.create(QueryEngineTDB.java:135)
at
app//org.apache.jena.query.QueryExecutionFactory.makePlan(QueryExecutionFactory.java:442)
at
app//org.apache.jena.query.QueryExecutionFactory.createPlan(QueryExecutionFactory.java:418)
at
app//org.apache.jena.sparql.modify.UpdateEngineWorker.evalBindings(UpdateEngineWorker.java:532)
at
app//org.apache.jena.sparql.modify.UpdateEngineWorker.visit(UpdateEngineWorker.java:371)
at
app//org.apache.jena.sparql.modify.request.UpdateModify.visit(UpdateModify.java:100)
at
app//org.apache.jena.sparql.modify.UpdateVisitorSink.send(UpdateVisitorSink.java:45)
at
app//org.apache.jena.sparql.modify.UpdateVisitorSink.send(UpdateVisitorSink.java:31)
at
[email protected]/java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:1003)
at
[email protected]/java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1061)
at app//org.apache.jena.atlas.iterator.Iter.sendToSink(Iter.java:776)
at
app//org.apache.jena.sparql.modify.UpdateProcessorBase.execute(UpdateProcessorBase.java:60)
at
app//org.apache.jena.sparql.exec.UpdateExecDataset.execute(UpdateExecDataset.java:37)
at
app//org.apache.jena.sparql.exec.UpdateExecDatasetBuilder.execute(UpdateExecDatasetBuilder.java:164)
at
app//org.apache.jena.sparql.exec.UpdateExecDatasetBuilder.execute(UpdateExecDatasetBuilder.java:169)
at
app//org.apache.jena.rdflink.RDFLinkDataset.lambda$update$1(RDFLinkDataset.java:107)
at app//org.apache.jena.system.Txn.exec(Txn.java:77)
at app//org.apache.jena.system.Txn.executeWrite(Txn.java:125)
at
app//org.apache.jena.rdflink.RDFLinkDataset.update(RDFLinkDataset.java:107)
at
app//org.apache.jena.rdflink.RDFConnectionAdapter.update(RDFConnectionAdapter.java:131)
at org.apache.jena.rdfconnection.RDFConnection$update$0.call(Unknown
Source)
at
app//org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at
app//org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at
app//org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
at
app//com.amazon.pk.knowledgestore.rdf.graph.store.RdfQuadStoreSparqlTest.update(RdfQuadStoreSparqlTest.groovy:115)
at
com.amazon.pk.knowledgestore.rdf.graph.store.RdfQuadStoreSparqlTest$update.callCurrent(Unknown
Source)
at
app//org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
at
app//org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
at
app//org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:194)
at
app//com.amazon.pk.knowledgestore.rdf.graph.store.RdfQuadStoreSparqlTest.testQueryFailure(RdfQuadStoreSparqlTest.groovy:108)
Code to repro the issue :
private final Triple triple1 = new Triple(
createURI("rdf:s1"),
createURI("rdf:p1"),
createLiteral("o1"))
private final Triple triple2 = new Triple(
createURI("rdf:s2"),
createURI("rdf:p2"),
createURI("rdf:o2"))
private final Triple triple3 = new Triple(
createURI("rdf:s3"),
createURI("rdf:p3"),
createLiteral("o3"))
private final graph1 = getNamedGraph()
private final graph2 = getNamedGraph()
@Test
void testQueryFailure() {
RDFConnection conn = RDFConnection.connect(TDBFactory.createDataset());
UpdateBuilder updateBuilder = new UpdateBuilder();
updateBuilder.addInsert(graph1, triple1);
SelectBuilder where = new SelectBuilder();
where.addWhere(triple2);
updateBuilder.addGraph(graph1, where);
SelectBuilder notExists = new SelectBuilder();
notExists.addWhere(triple3);
SelectBuilder where2 = new SelectBuilder();
where2.addFilter(where2.getExprFactory().notexists(notExists));
updateBuilder.addGraph(graph2, where2);
UpdateRequest updateRequest = updateBuilder.buildRequest();
System.out.println("From the tests : " + updateRequest.toString())
update(conn, updateRequest);
}
public void update(final RDFConnection conn, final UpdateRequest request) {
conn.begin(ReadWrite.WRITE);
try {
conn.update(request);
conn.commit();
} finally {
conn.end();
}
}
Thanks
Kishan Dhamotharan