Thanks Andy. Here's an example that exhibits the behavior. When the count
is zero, the warning is printed. Commenting out the second pattern in the
where-group causes the count to be 100 and no warning is printed.
-Patrick
package com.example;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.vocabulary.RDF;
public class JenaWarningExample {
private static Model model;
@BeforeClass
public static void setupClass() throws Exception {
model = ModelFactory.createDefaultModel();
Resource someClass = model.createResource("urn:example.com:
SomeClass");
for (int i = 0; i < 100; i++) {
Resource instance =
model.createResource("urn:example.com:someInstance:" + i);
model.add(instance, RDF.type, someClass);
}
}
@Test
public void testJenaWarning() throws IOException {
String query = " select (count (distinct ?instance) as ?n)
where { " +
" ?instance a
<urn:example.com:SomeClass>
. " +
" ?instance
<urn:example.com:someProperty>
?value . " +
" } ";
QueryExecution exec = QueryExecutionFactory.create(query,
model);
try {
ResultSet results = exec.execSelect();
int n = 0;
if (results.hasNext()) {
QuerySolution solution =
results.nextSolution();
n = solution.get("n").asLiteral().getInt();
}
assertEquals(0, n);
} finally {
exec.close();
}
}
}
On Sat, Mar 23, 2013 at 3:35 PM, Andy Seaborne <[email protected]> wrote:
> On 23/03/13 21:18, Patrick Logan wrote:
>
>> Using 2.10.0 jena.core and arq with an in-memory model, I am getting a
>> warning:
>>
>> WARN [2013-03-23 14:06:34,218]
>> com.hp.hpl.jena.sparql.engine.**iterator.QueryIteratorCheck: Open
>> iterator:
>> QueryIterSingleton/40500
>>
>> ...when closing the QueryExecution for the following query:
>>
>> select (count(distinct ?a) as ?n)
>> where {
>> ?a a <urn:example.com:Something> .
>> ?a <urn:example.com:hasSomethingE**lse> ?c .
>> }
>>
>> In this case the count happens to be zero.
>>
>> If I take out the second pattern in the where clause, the count is
>> 2000-something and there is no warning about an open iterator.
>>
>> The last bit of the stack trace looks like:
>>
>> QueryIteratorCheck.dump(**ExecutionContext, boolean) line: 87
>> QueryIteratorCheck.**checkForOpenIterators(**ExecutionContext) line: 59
>> QueryIteratorCheck.close() line: 50
>> QueryIteratorCloseable(**QueryIteratorWrapper).**closeIterator() line: 50
>> QueryIteratorCloseable(**QueryIteratorBase).close() line: 185
>> QueryIteratorCloseable.close() line: 39
>> QueryExecutionBase.close() line: 168
>>
>>
> I tried to recreate this but, whatever I try with the command line tools,
> it works find for me. How was the query called and closed?
>
> Is it a plain in-memory model or an inference model?
>
> A complete, minimal example would be helpful.
>
> Andy
>
>