You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by "Lars G. Svensson" <la...@web.de> on 2026/05/04 08:57:41 UTC

Empty URI <> returns empty set when executing SPARQL query

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("");
        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}";
        final Query q = QueryFactory.create(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



Re: Empty URI <> returns empty set when executing SPARQL query

Posted by "Lars G. Svensson" <la...@web.de>.
Am 4. Mai 2026 23:54:15 MESZ schrieb Andy Seaborne <an...@apache.org>:
>
>
>On 04/05/2026 09:57, Lars G. Svensson wrote:
>>
>> 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.

OK.
>
>>          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.

Ah, I think I understand. Thank you for the  explanation.

Best, 
Lars


Re: Empty URI <> returns empty set when executing SPARQL query

Posted by Andy Seaborne <an...@apache.org>.

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