Reputation: 111
I would like to insert RDF triples with dynamically changing object values, some of which may be null. In case of a null value, the triple should not be inserted. For example, let's say I want to insert 3 triples where both name and age could be any value including null:
<http://example.org/resource/123> a <http://example.org/type/person>
<http://example.org/resource/123> <http://example.org/property/name> name
<http://example.org/resource/123> <http://example.org/property/age> age
I could build such a query by using if-s, something like this:
String query = triple1 + (name == null ? "" : triple2) + (age == null ? "" : triple3);
However, I would like to use one static query. I am trying to achieve this by using ParameterizedSparqlString
. It works perfectly fine when all the values are non-null but sadly queryString.asUpdate()
crashes when there is at least one null literal.
// Example data
String subject = "http://example.org/resource/123";
String predicate1 = "http://example.org/property/name";
String object1 = "John Doe"; // Crashes when the value is changed to null
String predicate2 = "http://example.org/property/age";
Integer object2 = 18; // Crashes when the value is changed to null
// Create a parameterized SPARQL string
ParameterizedSparqlString queryString = new ParameterizedSparqlString();
queryString.setCommandText(
"INSERT DATA { ?s a <http://example.org/type/person> ; ?p1 ?o1 ; ?p2 ?o2 }");
// Set parameters with appropriate handling for null values
queryString.setIri("s", subject);
queryString.setIri("p1", predicate1);
if (object1 != null) {
queryString.setLiteral("o1", object1);
} else {
queryString.setLiteral("o1", (String) null);
}
queryString.setIri("p2", predicate2);
if (object2 != null) {
queryString.setLiteral("o2", object2);
} else {
queryString.setLiteral("o2", (String) null);
}
// Run the query. queryString.asUpdate() crashes when there are null values.
UpdateExec.service("http://localhost:3030/demo").
update(queryString.asUpdate()).execute();
Here is the crash:
java.lang.NullPointerException
at org.apache.jena.datatypes.xsd.XSDDatatype.unparse(XSDDatatype.java:284)
at org.apache.jena.graph.impl.LiteralLabelImpl.getLexicalForm(LiteralLabelImpl.java:303)
at org.apache.jena.graph.Node_Literal.getLiteralLexicalForm(Node_Literal.java:43)
at org.apache.jena.sparql.util.FmtUtils.stringForLiteral(FmtUtils.java:200)
at org.apache.jena.sparql.util.FmtUtils.stringForNode(FmtUtils.java:371)
at org.apache.jena.sparql.util.FmtUtils.stringForNode(FmtUtils.java:348)
at org.apache.jena.query.ParameterizedSparqlString.stringForNode(ParameterizedSparqlString.java:1355)
at org.apache.jena.query.ParameterizedSparqlString.toString(ParameterizedSparqlString.java:1400)
at org.apache.jena.query.ParameterizedSparqlString.asUpdate(ParameterizedSparqlString.java:1499)
at org.apache.jena.query.ParameterizedSparqlString.asUpdate(ParameterizedSparqlString.java:1487)
Thanks a lot! :)
Upvotes: 1
Views: 56