On 04/05/2026 09:57, Lars G. Svensson wrote:
Good morning, all.

This might be a newbie question, so please bear with me...

When using an empty URI, e.g. <> or <#>, as the subject of a statement, I 
cannot retrieve that statement from a model using SPARQL.

I'm using Jena 5.6.0. A minimal test case would be:

import static org.junit.jupiter.api.Assertions.assertTrue;

import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.vocabulary.DCTerms;
import org.junit.jupiter.api.Test;

class PointyBracketsTest {

     @Test
     void test() {
         final Resource r = ResourceFactory.createResource("");

The API does not resolve URIs - it allows relative URIs. Legacy.

It is not a good idea to use relative URIs in the API.

         final Model m = ModelFactory.createDefaultModel();
         m.add(r, DCTerms.title, "A Title");
         // check that the statement is present...
         final StmtIterator iter = m.listStatements();
         while (iter.hasNext()) {
             System.out.println(iter.nextStatement());
         }
         final String query = "SELECT * WHERE {<> ?p ?o}";

That query string is resolved. Parsing (RDF syntax, SPARQL syntax) always resolves URIs.

         final Query q = QueryFactory.create(query);

Parses with default base.

Try:
            // Set the base to something else.
            q.setBaseURI("http://myBase/";);
            System.out.println(q);

and you should see the real URI in the query.

         try (QueryExecution qexec = QueryExecutionFactory.create(q, m)) {
             final ResultSet rs = qexec.execSelect();
             assertTrue(rs.hasNext(), "No result found");
         }
     }

}

When I run the test, it prints out ' [, http://purl.org/dc/terms/title, A 
Title] ' and then fails.

I'd expect that the SPARQL query would return the added triple. The test also fails when I add a triple with 
non-empty subject (i. e. <#>) and then query with "SELECT * WHERE {<#> ?p ?o}" so it 
might be that there is something I've misunderstood. If I use a full URI, e. g. 
"urn:example:a-resource", the test passes.

Any help is very much appreciated. Thanks in advance!

Best,

Lars
    Andy

Reply via email to