#!/usr/bin/perl use strict; use warnings; no warnings 'redefine'; use Test::More; use lib qw(. t); require "models.pl"; my @files = map { "data/$_" } qw(about.xrdf foaf.xrdf); my @models = test_models( @files ); my $tests = 1 + (scalar(@models) * 31); plan tests => $tests; use_ok( 'RDF::Query' ); foreach my $model (@models) { print "\n#################################\n"; print "### Using model: $model\n\n"; { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?nick WHERE { ?person foaf:name "Lauren B" . OPTIONAL { ?person foaf:nick ?nick } } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $row = $stream->next; isa_ok( $row, "HASH" ); my ($p,$n) = @{ $row }{qw(person nick)}; ok( $p->isa('RDF::Trine::Node'), 'isa_node' ); is( $n, undef, 'missing nick' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?nick WHERE { ?person foaf:name "Gregory Todd Williams" . OPTIONAL { ?person foaf:nick ?nick } } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); while (my $row = $stream->next) { isa_ok( $row, "HASH" ); my ($p,$n) = @{ $row }{qw(person nick)}; ok( $p->isa('RDF::Trine::Node'), 'isa_node' ); ok( $n->isa('RDF::Trine::Node::Literal'), 'isa_literal(nick)' ); like( ($n and $n->as_string), qr/kasei|The Samo Fool/, ($n and $n->as_string) ); last; } } { print "# optional with trailing triples\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?nick ?page WHERE { ?person foaf:name "Gregory Todd Williams" . OPTIONAL { ?person foaf:nick ?nick } . ?person foaf:homepage ?page } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); while (my $row = $stream->next) { isa_ok( $row, "HASH" ); my ($p,$n,$h) = @{ $row }{qw(person nick page)}; ok( $p->isa('RDF::Trine::Node'), 'isa_node' ); ok( $n->isa('RDF::Trine::Node::Literal'), 'isa_literal(nick)' ); ok( $h->isa('RDF::Trine::Node::Resource'), 'isa_resource(homepage)' ); is( $h->uri_value, 'http://kasei.us/' ); like( ($n and $n->as_string), qr/kasei|The Samo Fool/, ($n and $n->as_string) ); last; } } { print "# 1-triple optional\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX dc: SELECT ?person ?h WHERE { ?person foaf:name "Gregory Todd Williams" . OPTIONAL { ?person foaf:homepage ?h . } } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $row = $stream->next; isa_ok( $row, "HASH" ); my ($p,$h) = @{ $row }{qw(person h)}; ok( $p->isa('RDF::Trine::Node'), 'isa_node(person)' ); ok( $h->isa('RDF::Trine::Node'), 'isa_node(homepage)' ); } { print "# 2-triple optional\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX dc: SELECT ?person ?h ?title WHERE { ?person foaf:name "Gregory Todd Williams" . OPTIONAL { ?person foaf:homepage ?h . ?h dc:title ?title } } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $row = $stream->next; isa_ok( $row, "HASH" ); my ($p,$h,$t) = @{ $row }{qw(person h title)}; ok( $p->isa('RDF::Trine::Node'), 'isa_node' ); is( $h, undef, 'no homepage' ); is( $t, undef, 'no homepage title' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?nick WHERE { ?person foaf:name "Lauren B" . OPTIONAL { ?person foaf:nick ?nick } . FILTER BOUND(?nick) . } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $row = $stream->next; ok( not($row), 'no results: successful BOUND() filter' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?school WHERE { ?person a foaf:Person ; foaf:nick "kasei" . OPTIONAL { ?person foaf:schoolHomepage ?school . } . } END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $count = 0; while (my $row = $stream->next) { my $school = $row->{school}; my $str = $school->as_string; like( $str, qr<(smmusd|wheatonma)>, "exected school: $str" ); $count++; } is( $count, 2, 'expected result count' ); } }