4
no warnings 'redefine';
7
BEGIN { require "models.pl"; }
10
use Test::More tests => 33;
12
use_ok( 'RDF::Query' );
14
################################################################################
19
PREFIX ex: <http://example.com/>
20
SELECT ?x (SUM(?o) AS ?sum) WHERE {
27
my $query = new RDF::Query ( $sparql );
28
my $string = $query->as_sparql;
29
$string =~ s/\s+/ /gms;
30
is( $string, "PREFIX ex: <http://example.com/> SELECT ?x (SUM(?o) AS ?sum) WHERE { ?x ex:price ?o . } GROUP BY ?x HAVING (SUM(?o) > 5) ORDER BY ?sum", 'sparql to sparql aggregate' );
34
my $rdql = qq{SELECT ?person WHERE (?person foaf:name "Gregory Todd Williams") USING foaf FOR <http://xmlns.com/foaf/0.1/>};
35
my $query = new RDF::Query ( $rdql, undef, undef, 'rdql' );
36
my $string = $query->as_sparql;
37
$string =~ s/\s+/ /gms;
38
is( $string, 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT * WHERE { ?person foaf:name "Gregory Todd Williams" . }', 'rdql to sparql' );
42
my $sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person; foaf:name ?name } ORDER BY ?name";
43
my $query = new RDF::Query ( $sparql );
44
my $string = $query->as_sparql;
45
$string =~ s/\s+/ /gms;
46
is( $string, "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person . ?person foaf:name ?name . } ORDER BY ?name", 'sparql to sparql' );
50
my $sparql = 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?p WHERE { ?p a foaf:Person ; foaf:homepage ?homepage . FILTER( REGEX( STR(?homepage), "^http://www.rpi.edu/.+") ) }';
51
my $query = new RDF::Query ( $sparql );
52
my $string = $query->as_sparql;
53
$string =~ s/\s+/ /gms;
54
is( $string, 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?p WHERE { ?p a foaf:Person . ?p foaf:homepage ?homepage . FILTER( REGEX(STR(?homepage), "^http://www.rpi.edu/.+") ) . }', 'sparql to sparql with regex filter' );
58
my $sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person; foaf:name ?name . FILTER( ?name < 'Greg' ) }";
59
my $query = new RDF::Query ( $sparql );
60
my $string = $query->as_sparql;
61
$string =~ s/\s+/ /gms;
62
is( $string, 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person . ?person foaf:name ?name . FILTER( (?name < "Greg") ) . }', 'sparql to sparql with less-than filter' );
66
my $sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person; foaf:name ?name } ORDER BY ?name LIMIT 5 OFFSET 5";
67
my $query = new RDF::Query ( $sparql );
68
my $string = $query->as_sparql;
69
$string =~ s/\s+/ /gms;
70
is( $string, "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person a foaf:Person . ?person foaf:name ?name . } ORDER BY ?name OFFSET 5 LIMIT 5", 'sparql to sparql with slice' );
74
my $query = new RDF::Query ( <<"END", undef, undef, 'rdql' );
76
WHERE (?person foaf:name "Gregory Todd Williams")
77
USING foaf FOR <http://xmlns.com/foaf/0.1/>
79
my $sparql = $query->as_sparql;
80
my $query2 = RDF::Query->new( $sparql );
81
my $again = $query2->as_sparql;
82
is( $sparql, $again, 'as_sparql: rdql round trip: select' );
86
my $rquery = new RDF::Query ( <<"END", undef, undef, 'rdql' );
88
WHERE (?person foaf:name "Gregory Todd Williams")
89
USING foaf FOR <http://xmlns.com/foaf/0.1/>
91
my $squery = new RDF::Query ( <<"END", undef, undef, 'sparql' );
92
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
93
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
95
WHERE { ?person foaf:name "Gregory Todd Williams" }
97
is( $squery->as_sparql, $rquery->as_sparql, 'as_sparql: rdql-sparql equality' );
101
my $query = new RDF::Query ( <<"END" );
102
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
103
CONSTRUCT { ?p foaf:name ?name }
104
WHERE { ?p foaf:firstname ?name }
106
my $sparql = $query->as_sparql;
107
my $again = RDF::Query->new( $sparql )->as_sparql;
108
is( $sparql, $again, 'as_sparql: sparql round trip: construct' );
112
my $query = new RDF::Query ( <<"END" );
113
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
115
WHERE { ?p foaf:name ?name }
117
my $sparql = $query->as_sparql;
118
my $again = RDF::Query->new( $sparql )->as_sparql;
119
is( $sparql, $again, 'as_sparql: sparql round trip: describe' );
123
my $query = new RDF::Query ( <<"END" );
124
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
126
WHERE { [ foaf:name "Gregory Todd Williams" ] }
128
my $sparql = $query->as_sparql;
129
my $again = RDF::Query->new( $sparql )->as_sparql;
130
is( $sparql, $again, 'as_sparql: sparql round trip: ask' );
134
my $query = new RDF::Query ( <<"END" );
135
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
137
FROM NAMED <http://example.com/>
140
[ foaf:name "Gregory Todd Williams" ]
144
my $sparql = $query->as_sparql;
145
my $again = RDF::Query->new( $sparql )->as_sparql;
146
is( $sparql, $again, 'as_sparql: sparql round trip: select with named graph' );
150
my $query = new RDF::Query ( <<"END", undef, undef, 'sparql11' );
151
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
154
{ ?person foaf:name ?name } UNION { ?person foaf:nick ?name }
157
my $sparql = $query->as_sparql;
158
my $query2 = RDF::Query->new( $sparql );
159
my $again = $query2->as_sparql;
160
is( $sparql, $again, 'as_sparql: union' );
164
my $query = new RDF::Query ( <<"END" );
165
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
168
?person foaf:name ?name .
169
FILTER( !BOUND(?name) )
172
my $sparql = $query->as_sparql;
173
my $again = RDF::Query->new( $sparql )->as_sparql;
174
is( $sparql, $again, 'as_sparql: select with filter !BOUND' );
178
my $query = new RDF::Query ( <<"END" );
179
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
180
SELECT DISTINCT ?name
182
?person foaf:name ?name .
185
my $sparql = $query->as_sparql;
186
my $qagain = RDF::Query->new( $sparql );
187
my $again = $qagain->as_sparql;
188
is( $sparql, $again, 'as_sparql: select DISTINCT' );
191
################################################################################
195
my $query = new RDF::Query ( <<"END" );
196
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
198
WHERE { ?person foaf:name "Gregory Todd Williams" }
200
my $sse = $query->sse;
201
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person) (BGP (triple ?person foaf:name "Gregory Todd Williams"))))', 'sse: select' );
202
# my $alg = RDF::Query::Algebra->from_sse( my $string = $sse );
203
# is( _CLEAN_WS($alg->sse), _CLEAN_WS($sse), 'sse: re-serialization of expression' );
207
my $query = new RDF::Query ( <<"END" );
208
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
210
FROM NAMED <http://example.com/>
213
[ foaf:name "Gregory Todd Williams" ]
217
my $sse = $query->sse;
218
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?name) (namedgraph ?g (BGP (triple _:a1 foaf:name "Gregory Todd Williams")))))', 'sse: select with named graph' );
222
my $query = new RDF::Query ( <<"END" );
223
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
224
PREFIX dc: <http://purl.org/dc/elements/1.1/>
227
{ [ foaf:name ?name ] }
229
{ [ dc:title ?name ] }
232
my $sse = $query->sse;
233
is( _CLEAN_WS($sse), '(prefix ((dc: <http://purl.org/dc/elements/1.1/>) (foaf: <http://xmlns.com/foaf/0.1/>)) (project (?name) (union (BGP (triple _:a1 foaf:name ?name)) (BGP (triple _:a2 dc:title ?name)))))', 'sse: select with union' );
237
my $query = new RDF::Query ( <<"END" );
238
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
241
?person foaf:name ?name .
242
FILTER( ?name < "Greg" )
245
my $sse = $query->sse;
246
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person) (filter (< ?name "Greg") (BGP (triple ?person foaf:name ?name)))))', 'sse: select with filter <' );
250
my $query = new RDF::Query ( <<"END" );
251
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
254
?person foaf:name ?name .
255
FILTER( !BOUND(?name) )
258
my $sse = $query->sse;
259
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person) (filter (! (bound ?name)) (BGP (triple ?person foaf:name ?name)))))', 'sse: select with filter !BOUND' );
263
my $query = new RDF::Query ( <<"END" );
264
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
267
?person foaf:name ?name .
268
FILTER( REGEX(?name, "Greg") )
271
my $sse = $query->sse;
272
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person) (filter (regex ?name "Greg") (BGP (triple ?person foaf:name ?name)))))', 'sse: select with filter regex' );
276
my $query = new RDF::Query ( <<"END", undef, undef, 'sparql11' );
277
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
280
{ ?person foaf:name ?name } UNION { ?person foaf:nick ?name }
283
my $sse = $query->sse;
284
is( _CLEAN_WS($sse), '(prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person ?name) (union (BGP (triple ?person foaf:name ?name)) (BGP (triple ?person foaf:nick ?name)))))', 'sse: select with filter regex' );
288
my $query = new RDF::Query ( <<"END" );
289
BASE <http://xmlns.com/>
290
PREFIX foaf: </foaf/0.1/>
292
WHERE { ?person foaf:name "Gregory Todd Williams" }
294
my $sse = $query->sse;
295
is( _CLEAN_WS($sse), '(base <http://xmlns.com/> (prefix ((foaf: <http://xmlns.com/foaf/0.1/>)) (project (?person) (BGP (triple ?person foaf:name "Gregory Todd Williams")))))', 'sse: select' );
299
my $query = new RDF::Query ( <<"END", { update => 1 } );
300
LOAD <documentURI> INTO GRAPH <uri>
302
my $sse = $query->sse;
303
is( _CLEAN_WS($sse), '(load <documentURI> <uri>)', 'sse: load' );
307
my $query = new RDF::Query ( <<"END", { update => 1 } );
309
SELECT * WHERE { ?s ?p ?o }
311
my $sse = $query->sse;
312
is( _CLEAN_WS($sse), '(sequence (load <documentURI>) (project (?s ?p ?o) (BGP (triple ?s ?p ?o))))', 'sse: sequence' );
316
my $sse = '(triple _:a foaf:name "foo\\\\\\tbar\\nbaz"^^<foo://bar>)';
317
my $ctx = { namespaces => { foaf => 'http://xmlns.com/foaf/0.1/' } };
318
my $st = RDF::Query::Algebra::Triple->from_sse( my $string = $sse, $ctx );
319
is( $st->sse( $ctx ), $sse, 'sse: parse triple' );
323
my $sse = '(BGP (triple _:a foaf:name "foo\\\\\\tbar\\nbaz"^^<foo://bar>))';
324
my $ctx = { namespaces => { foaf => 'http://xmlns.com/foaf/0.1/' } };
325
my $bgp = RDF::Query::Algebra->from_sse( my $string = $sse, $ctx );
326
isa_ok( $bgp, 'RDF::Query::Algebra::BasicGraphPattern' );
327
is( _CLEAN_WS($bgp->sse( $ctx )), $sse, 'sse: parse BGP' );
330
################################################################################
331
### VARIABLEBINDINGS TESTS
333
my $a = RDF::Query::Node::Literal->new('a');
334
my $b = RDF::Query::Node::Resource->new('http://b/');
335
my $c = RDF::Query::Node::Blank->new('c');
338
my $binding = RDF::Query::VariableBindings->new({ 'a' => $a });
339
is( "$binding", '{ a="a" }', 'variable binding (literal)' );
343
my $binding = RDF::Query::VariableBindings->new({ 'b' => $b });
344
is( "$binding", '{ b=<http://b/> }', 'variable binding (resource)' );
348
my $binding = RDF::Query::VariableBindings->new({ 'c' => $c });
349
is( "$binding", '{ c=(c) }', 'variable binding (blank)' );
353
my $binding = RDF::Query::VariableBindings->new({ 'a' => $a, b => undef, c => $c });
354
is( "$binding", '{ a="a", b=(), c=(c) }', 'variable binding (literal, blank, (undef))' );
363
1 while s/[)]\s+[)]/))/g;