Arturs
Arturs

Reputation: 111

Parameterized SPARQL query that supports null parameter values

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

Answers (0)

Related Questions