Skip to content

Commit 29b2e70

Browse files
author
Olaf Hartig
committed
extended the TriplePatternInterface to support anonymous variables; see LinkedDataFragments#28
1 parent f03b8ed commit 29b2e70

15 files changed

+296
-164
lines changed

src/org/linkeddatafragments/datasource/AbstractRequestProcessorForTriplePatterns.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,46 @@
1313
* Base class for implementations of {@link IFragmentRequestProcessor} that
1414
* process {@link TriplePatternFragmentRequest}s.
1515
*
16-
* @param <TermType> type for representing RDF terms in triple patterns
17-
* @param <VarType> type for representing specific variables in triple patterns
16+
* @param <CTT>
17+
* type for representing constants in triple patterns (i.e., URIs and
18+
* literals)
19+
* @param <NVT>
20+
* type for representing named variables in triple patterns
21+
* @param <AVT>
22+
* type for representing anonymous variables in triple patterns (i.e.,
23+
* variables denoted by a blank node)
1824
*
1925
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
2026
*/
2127
public abstract class
22-
AbstractRequestProcessorForTriplePatterns<TermType,VarType>
28+
AbstractRequestProcessorForTriplePatterns<CTT,NVT,AVT>
2329
extends AbstractRequestProcessor
2430
{
2531
@Override
26-
protected final Worker<TermType,VarType> getWorker(
32+
protected final Worker<CTT,NVT,AVT> getWorker(
2733
final LinkedDataFragmentRequest request )
2834
throws IllegalArgumentException
2935
{
30-
if ( request instanceof TriplePatternFragmentRequest<?,?> ) {
36+
if ( request instanceof TriplePatternFragmentRequest<?,?,?> ) {
3137
@SuppressWarnings("unchecked")
32-
final TriplePatternFragmentRequest<TermType,VarType> tpfRequest =
33-
(TriplePatternFragmentRequest<TermType,VarType>) request;
38+
final TriplePatternFragmentRequest<CTT,NVT,AVT> tpfRequest =
39+
(TriplePatternFragmentRequest<CTT,NVT,AVT>) request;
3440
return getTPFSpecificWorker( tpfRequest );
3541
}
3642
else
3743
throw new IllegalArgumentException( request.getClass().getName() );
3844
}
3945

40-
abstract protected Worker<TermType,VarType> getTPFSpecificWorker(
41-
final TriplePatternFragmentRequest<TermType,VarType> request )
46+
abstract protected Worker<CTT,NVT,AVT> getTPFSpecificWorker(
47+
final TriplePatternFragmentRequest<CTT,NVT,AVT> request )
4248
throws IllegalArgumentException;
4349

4450

45-
abstract static protected class Worker<TermType,VarType>
51+
abstract static protected class Worker<CTT,NVT,AVT>
4652
extends AbstractRequestProcessor.Worker
4753
{
4854
public Worker(
49-
final TriplePatternFragmentRequest<TermType,VarType> request )
55+
final TriplePatternFragmentRequest<CTT,NVT,AVT> request )
5056
{
5157
super( request );
5258
}
@@ -63,8 +69,8 @@ public LinkedDataFragment createRequestedFragment()
6369
offset = 0L;
6470

6571
@SuppressWarnings("unchecked")
66-
final TriplePatternFragmentRequest<TermType,VarType> tpfRequest =
67-
(TriplePatternFragmentRequest<TermType,VarType>) request;
72+
final TriplePatternFragmentRequest<CTT,NVT,AVT> tpfRequest =
73+
(TriplePatternFragmentRequest<CTT,NVT,AVT>) request;
6874

6975
return createFragment( tpfRequest.getSubject(),
7076
tpfRequest.getPredicate(),
@@ -73,9 +79,9 @@ public LinkedDataFragment createRequestedFragment()
7379
}
7480

7581
abstract protected LinkedDataFragment createFragment(
76-
final TriplePatternElement<TermType,VarType> subj,
77-
final TriplePatternElement<TermType,VarType> pred,
78-
final TriplePatternElement<TermType,VarType> obj,
82+
final TriplePatternElement<CTT,NVT,AVT> subj,
83+
final TriplePatternElement<CTT,NVT,AVT> pred,
84+
final TriplePatternElement<CTT,NVT,AVT> obj,
7985
final long offset,
8086
final long limit )
8187
throws IllegalArgumentException;

src/org/linkeddatafragments/datasource/hdt/HdtBasedRequestProcessorForTPFs.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
2828
*/
2929
public class HdtBasedRequestProcessorForTPFs
30-
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
30+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String,String>
3131
{
3232
protected final HDT datasource;
3333
protected final NodeDictionary dictionary;
@@ -46,38 +46,40 @@ public HdtBasedRequestProcessorForTPFs( String hdtFile ) throws IOException
4646

4747
@Override
4848
protected Worker getTPFSpecificWorker(
49-
final TriplePatternFragmentRequest<RDFNode,String> request )
49+
final TriplePatternFragmentRequest<RDFNode,String,String> request )
5050
throws IllegalArgumentException
5151
{
5252
return new Worker( request );
5353
}
5454

5555

5656
protected class Worker
57-
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
57+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String,String>
5858
{
59-
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
59+
public Worker(
60+
final TriplePatternFragmentRequest<RDFNode,String,String> req )
6061
{
6162
super( req );
6263
}
6364

6465
@Override
6566
protected LinkedDataFragment createFragment(
66-
final TriplePatternElement<RDFNode,String> subject,
67-
final TriplePatternElement<RDFNode,String> predicate,
68-
final TriplePatternElement<RDFNode,String> object,
69-
final long offset,
70-
final long limit )
67+
final TriplePatternElement<RDFNode,String,String> subject,
68+
final TriplePatternElement<RDFNode,String,String> predicate,
69+
final TriplePatternElement<RDFNode,String,String> object,
70+
final long offset,
71+
final long limit )
7172
{
7273
// FIXME: The following algorithm is incorrect for cases in which
7374
// the requested triple pattern contains a specific variable
74-
// multiple times (e.g., ?x foaf:knows ?x ).
75+
// multiple times;
76+
// e.g., (?x foaf:knows ?x ) or (_:bn foaf:knows _:bn)
7577
// see https://github.com/LinkedDataFragments/Server.Java/issues/23
7678

7779
// look up the result from the HDT datasource)
78-
int subjectId = subject.isVariable() ? 0 : dictionary.getIntID(subject.asTerm().asNode(), TripleComponentRole.SUBJECT);
79-
int predicateId = predicate.isVariable() ? 0 : dictionary.getIntID(predicate.asTerm().asNode(), TripleComponentRole.PREDICATE);
80-
int objectId = object.isVariable() ? 0 : dictionary.getIntID(object.asTerm().asNode(), TripleComponentRole.OBJECT);
80+
int subjectId = subject.isVariable() ? 0 : dictionary.getIntID(subject.asConstantTerm().asNode(), TripleComponentRole.SUBJECT);
81+
int predicateId = predicate.isVariable() ? 0 : dictionary.getIntID(predicate.asConstantTerm().asNode(), TripleComponentRole.PREDICATE);
82+
int objectId = object.isVariable() ? 0 : dictionary.getIntID(object.asConstantTerm().asNode(), TripleComponentRole.OBJECT);
8183

8284
if (subjectId < 0 || predicateId < 0 || objectId < 0) {
8385
return createEmptyTriplePatternFragment();

src/org/linkeddatafragments/datasource/index/IndexRequestProcessorForTPFs.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
2929
*/
3030
public class IndexRequestProcessorForTPFs
31-
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
31+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String,String>
3232
{
3333
final static String RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
3434
final static String RDFS = "http://www.w3.org/2000/01/rdf-schema#";
@@ -58,40 +58,42 @@ public IndexRequestProcessorForTPFs(
5858

5959
@Override
6060
protected Worker getTPFSpecificWorker(
61-
final TriplePatternFragmentRequest<RDFNode,String> request )
61+
final TriplePatternFragmentRequest<RDFNode,String,String> request )
6262
throws IllegalArgumentException
6363
{
6464
return new Worker( request );
6565
}
6666

6767

6868
protected class Worker
69-
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
69+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String,String>
7070
{
71-
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
71+
public Worker(
72+
final TriplePatternFragmentRequest<RDFNode,String,String> req )
7273
{
7374
super( req );
7475
}
7576

7677
@Override
7778
protected LinkedDataFragment createFragment(
78-
final TriplePatternElement<RDFNode,String> s,
79-
final TriplePatternElement<RDFNode,String> p,
80-
final TriplePatternElement<RDFNode,String> o,
81-
final long offset,
82-
final long limit )
79+
final TriplePatternElement<RDFNode,String,String> s,
80+
final TriplePatternElement<RDFNode,String,String> p,
81+
final TriplePatternElement<RDFNode,String,String> o,
82+
final long offset,
83+
final long limit )
8384
{
8485
// FIXME: The following algorithm is incorrect for cases in which
8586
// the requested triple pattern contains a specific variable
86-
// multiple times (e.g., ?x foaf:knows ?x ).
87+
// multiple times;
88+
// e.g., (?x foaf:knows ?x ) or (_:bn foaf:knows _:bn)
8789
// see https://github.com/LinkedDataFragments/Server.Java/issues/25
8890

8991
final Resource subject = s.isVariable() ? null
90-
: s.asTerm().asResource();
92+
: s.asConstantTerm().asResource();
9193
final Property predicate = p.isVariable() ? null
92-
: ResourceFactory.createProperty(p.asTerm().asResource().getURI());
94+
: ResourceFactory.createProperty(p.asConstantTerm().asResource().getURI());
9395
final RDFNode object = o.isVariable() ? null
94-
: o.asTerm();
96+
: o.asConstantTerm();
9597

9698
StmtIterator listStatements = model.listStatements(subject, predicate, object);
9799
Model result = ModelFactory.createDefaultModel();

src/org/linkeddatafragments/datasource/tdb/JenaTDBBasedRequestProcessorForTPFs.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
3131
*/
3232
public class JenaTDBBasedRequestProcessorForTPFs
33-
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
33+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String,String>
3434
{
3535
private final Dataset tdb;
3636
private final String sparql = "CONSTRUCT WHERE { ?s ?p ?o } " +
@@ -43,44 +43,46 @@ public class JenaTDBBasedRequestProcessorForTPFs
4343

4444
@Override
4545
protected Worker getTPFSpecificWorker(
46-
final TriplePatternFragmentRequest<RDFNode,String> request )
46+
final TriplePatternFragmentRequest<RDFNode,String,String> request )
4747
throws IllegalArgumentException
4848
{
4949
return new Worker( request );
5050
}
5151

5252

5353
protected class Worker
54-
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
54+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String,String>
5555
{
56-
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
56+
public Worker(
57+
final TriplePatternFragmentRequest<RDFNode,String,String> req )
5758
{
5859
super( req );
5960
}
6061

6162
@Override
6263
protected LinkedDataFragment createFragment(
63-
final TriplePatternElement<RDFNode,String> subject,
64-
final TriplePatternElement<RDFNode,String> predicate,
65-
final TriplePatternElement<RDFNode,String> object,
66-
final long offset,
67-
final long limit )
64+
final TriplePatternElement<RDFNode,String,String> subject,
65+
final TriplePatternElement<RDFNode,String,String> predicate,
66+
final TriplePatternElement<RDFNode,String,String> object,
67+
final long offset,
68+
final long limit )
6869
{
6970
// FIXME: The following algorithm is incorrect for cases in which
7071
// the requested triple pattern contains a specific variable
71-
// multiple times (e.g., ?x foaf:knows ?x ).
72+
// multiple times;
73+
// e.g., (?x foaf:knows ?x ) or (_:bn foaf:knows _:bn)
7274
// see https://github.com/LinkedDataFragments/Server.Java/issues/24
7375

7476
Model model = tdb.getDefaultModel();
7577
QuerySolutionMap map = new QuerySolutionMap();
7678
if ( ! subject.isVariable() ) {
77-
map.add("s", subject.asTerm());
79+
map.add("s", subject.asConstantTerm());
7880
}
7981
if ( ! predicate.isVariable() ) {
80-
map.add("p", predicate.asTerm());
82+
map.add("p", predicate.asConstantTerm());
8183
}
8284
if ( ! object.isVariable() ) {
83-
map.add("o", object.asTerm());
85+
map.add("o", object.asConstantTerm());
8486
}
8587

8688
query.setOffset(offset);

src/org/linkeddatafragments/fragments/tpf/TPFRequestParser.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
*
1717
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
1818
*/
19-
public class TPFRequestParser<TermType,VarType>
19+
public class TPFRequestParser<ConstantTermType,NamedVarType,AnonVarType>
2020
extends FragmentRequestParserBase
2121
{
22-
public final TriplePatternElementParser<TermType,VarType> elmtParser;
22+
public final TriplePatternElementParser<ConstantTermType,NamedVarType,AnonVarType> elmtParser;
2323

2424
public TPFRequestParser(
25-
final TriplePatternElementParser<TermType,VarType> elmtParser )
25+
final TriplePatternElementParser<ConstantTermType,NamedVarType,AnonVarType> elmtParser )
2626
{
2727
this.elmtParser = elmtParser;
2828
}
@@ -47,7 +47,7 @@ public Worker( final HttpServletRequest request,
4747
public LinkedDataFragmentRequest createFragmentRequest()
4848
throws IllegalArgumentException
4949
{
50-
return new TriplePatternFragmentRequestImpl<TermType,VarType>(
50+
return new TriplePatternFragmentRequestImpl<ConstantTermType,NamedVarType,AnonVarType>(
5151
getFragmentURL(),
5252
getDatasetURL(),
5353
pageNumberWasRequested,
@@ -57,22 +57,22 @@ public LinkedDataFragmentRequest createFragmentRequest()
5757
getObject() );
5858
}
5959

60-
public TriplePatternElement<TermType,VarType> getSubject() {
60+
public TriplePatternElement<ConstantTermType,NamedVarType,AnonVarType> getSubject() {
6161
return getParameterAsTriplePatternElement(
6262
TriplePatternFragmentRequest.PARAMETERNAME_SUBJ );
6363
}
6464

65-
public TriplePatternElement<TermType,VarType> getPredicate() {
65+
public TriplePatternElement<ConstantTermType,NamedVarType,AnonVarType> getPredicate() {
6666
return getParameterAsTriplePatternElement(
6767
TriplePatternFragmentRequest.PARAMETERNAME_PRED );
6868
}
6969

70-
public TriplePatternElement<TermType,VarType> getObject() {
70+
public TriplePatternElement<ConstantTermType,NamedVarType,AnonVarType> getObject() {
7171
return getParameterAsTriplePatternElement(
7272
TriplePatternFragmentRequest.PARAMETERNAME_OBJ );
7373
}
7474

75-
public TriplePatternElement<TermType,VarType>
75+
public TriplePatternElement<ConstantTermType,NamedVarType,AnonVarType>
7676
getParameterAsTriplePatternElement( final String paramName )
7777
{
7878
final String parameter = request.getParameter( paramName );

src/org/linkeddatafragments/fragments/tpf/TPFRequestParserForJenaBackends.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
1111
*/
1212
public class TPFRequestParserForJenaBackends
13-
extends TPFRequestParser<RDFNode,String>
13+
extends TPFRequestParser<RDFNode,String,String>
1414
{
1515
private static TPFRequestParserForJenaBackends instance = null;
1616

0 commit comments

Comments
 (0)