#!/usr/bin/perl use strict; use warnings; no warnings 'redefine'; use File::Spec; use lib qw(. t); BEGIN { require "models.pl"; } use Test::More; my $tests = 7; my @models = test_models( qw(data/greenwich.rdf data/about.xrdf) ); plan tests => 1 + ($tests * scalar(@models)); use_ok( 'RDF::Query' ); foreach my $model (@models) { print "\n#################################\n"; print "### Using model: $model\n"; { print "# select expression (node plus literal)\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql11' ); PREFIX foaf: PREFIX geo: SELECT (?lat AS ?latitude) WHERE { ?point a geo:Point ; foaf:name "Royal Observatory Greenwich" ; geo:lat ?lat ; geo:long ?long } END my $count = 0; my $stream = $query->execute( $model ); while (my $row = $stream->next) { my ($lat) = @{ $row }{qw(latitude)}; is( $lat->literal_value, '51.477222', 'AS for alpha conversion' ); } continue { ++$count }; is( $count, 1, 'expecting one statement in model' ); } { print "# select expression (node plus literal)\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql11' ); PREFIX foaf: PREFIX geo: SELECT ?lat (?long + 1.0 AS ?long_off) WHERE { ?point a geo:Point ; foaf:name "Royal Observatory Greenwich" ; geo:lat ?lat ; geo:long ?long } END my $count = 0; my $stream = $query->execute( $model ); while (my $row = $stream->next) { my ($lat, $long) = @{ $row }{qw(lat long_off)}; is( $lat->literal_value, '51.477222', 'existing latitude' ); cmp_ok( $long->literal_value, '==', 1, 'modified longitude' ); } continue { ++$count }; is( $count, 1, 'expecting one statement in model' ); } eval "use Geo::Distance 0.09;"; my $GEO_DISTANCE_LOADED = ($@) ? 0 : 1; SKIP: { skip( "Need Geo::Distance 0.09 or higher to run these tests.", 2 ) unless ($GEO_DISTANCE_LOADED); print "# select expression (function)\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql11' ); PREFIX dcterms: PREFIX foaf: PREFIX geo: PREFIX ldodds: SELECT ?image ?name (ldodds:Distance(?lat, ?long, 41.849331, -71.392) AS ?dist) WHERE { ?image a foaf:Image ; dcterms:spatial [ foaf:name ?name ; geo:lat ?lat ; geo:long ?long ; ] . } ORDER BY ldodds:Distance(?lat, ?long, 41.849331, -71.392) LIMIT 1 END my $stream = $query->execute( $model ); my $count = 0; while (my $row = $stream->next()) { my ($image, $pname, $pdist) = @{ $row }{qw(image name dist)}; my $name = $pname->literal_value; my $dist = $pdist->literal_value; like( $dist, qr/^0[.]0577\d*$/, "distance $name" ); $count++; } is( $count, 1, "ldodds:Distance: 1 objects found" ); } }