1
1
package org .linkeddatafragments .datasource ;
2
2
3
+ import com .hp .hpl .jena .graph .GraphStatisticsHandler ;
4
+ import com .hp .hpl .jena .graph .Node ;
3
5
import com .hp .hpl .jena .query .Dataset ;
4
6
import com .hp .hpl .jena .query .Query ;
5
7
import com .hp .hpl .jena .query .QueryExecution ;
23
25
*/
24
26
public class JenaTDBDataSource extends DataSource {
25
27
private final Dataset tdb ;
26
- private final String sparql = "CONSTRUCT ?s ?p ?o " +
27
- "ORDER BY ?s ?p ?o" ;
28
+ private final String sparql = "CONSTRUCT { ?s ?p ?o } " +
29
+ "WHERE { ?s ?p ?o } " +
30
+ "ORDER BY ?s ?p ?o" ;
31
+
28
32
private final Query query = QueryFactory .create (sparql , Syntax .syntaxSPARQL_11 );
29
33
30
34
@ Override
@@ -41,20 +45,25 @@ public TriplePatternFragment getFragment(Resource subject, Property predicate, R
41
45
42
46
query .setOffset (offset );
43
47
query .setLimit (limit );
44
-
45
- QueryExecution qexec = QueryExecutionFactory .create (query , model );
46
- final Model triples = ModelFactory .createDefaultModel ();
48
+
49
+ QueryExecution qexec = QueryExecutionFactory .create (query , model , map );
50
+ Model triples = ModelFactory .createDefaultModel ();
47
51
qexec .execConstruct (triples );
52
+
53
+ // For now, fake the estimate
54
+ long size = triples .size ();
55
+ long estimate = (size == limit ) ? offset + limit + 1 : offset + size ;
56
+ // Try to get a better estimate
57
+ GraphStatisticsHandler stats = model .getGraph ().getStatisticsHandler ();
58
+ if (stats != null ) {
59
+ estimate = stats .getStatistic (subject .asNode (), predicate .asNode (), object .asNode ());
60
+ }
48
61
49
62
tdb .end ();
50
63
51
64
if (triples .isEmpty ()) {
52
65
return new TriplePatternFragmentBase ();
53
66
} else {
54
- // For now, fake the estimate
55
- long size = triples .size ();
56
- long estimate = (size == limit ) ? offset + limit + 1 : offset + size ;
57
-
58
67
return new TriplePatternFragmentBase (triples , estimate );
59
68
}
60
69
}
0 commit comments