| RDF-Query documentation | Contained in the RDF-Query distribution. |
RDF::Query::Algebra::Service - Algebra class for SERVICE (federation) patterns
This document describes RDF::Query::Algebra::Service version 2.907.
Beyond the methods documented below, this class inherits methods from the RDF::Query::Algebra class.
new ( $endpoint, $pattern, $silent )Returns a new Service structure.
construct_argsReturns a list of arguments that, passed to this class' constructor, will produce a clone of this algebra pattern.
endpointReturns the endpoint resource of the named graph expression.
patternReturns the graph pattern of the named graph expression.
silentReturns true if the service operation is to ignore errors during execution.
add_bloom ( $variable, $filter )Adds a FILTER to the enclosed GroupGraphPattern to restrict values of the named
$variable to the values encoded in the $filter (a
Bloom::Filter object).
sseReturns the SSE string for this algebra expression.
as_sparqlReturns the SPARQL string for this algebra expression.
as_hashReturns the query as a nested set of plain data structures (no objects).
typeReturns the type of this algebra expression.
referenced_variablesReturns a list of the variable names used in this algebra expression.
potentially_boundReturns a list of the variable names used in this algebra expression that will bind values during execution.
definite_variablesReturns a list of the variable names that will be bound after evaluating this algebra expression.
qualify_uris ( \%namespaces, $base_uri )Returns a new algebra pattern where all referenced Resource nodes representing QNames (ns:local) are qualified using the supplied %namespaces.
Gregory Todd Williams <gwilliams@cpan.org>
| RDF-Query documentation | Contained in the RDF-Query distribution. |
# RDF::Query::Algebra::Service # -----------------------------------------------------------------------------
package RDF::Query::Algebra::Service; use strict; use warnings; use base qw(RDF::Query::Algebra); use Log::Log4perl; use URI::Escape; use MIME::Base64; use Data::Dumper; use RDF::Query::Error; use Carp qw(carp croak confess); use Scalar::Util qw(blessed reftype); use Storable qw(store_fd fd_retrieve); use RDF::Trine::Iterator qw(sgrep smap swatch); ###################################################################### our ($VERSION, $BLOOM_FILTER_ERROR_RATE); BEGIN { $BLOOM_FILTER_ERROR_RATE = 0.1; $VERSION = '2.907'; } ######################################################################
sub new { my $class = shift; my $endpoint = shift; my $pattern = shift; my $silent = shift || 0; return bless( [ 'SERVICE', $endpoint, $pattern, $silent ], $class ); }
sub construct_args { my $self = shift; return ($self->endpoint, $self->pattern); }
sub endpoint { my $self = shift; if (@_) { my $endpoint = shift; $self->[1] = $endpoint; } my $endpoint = $self->[1]; return $endpoint; }
sub pattern { my $self = shift; if (@_) { my $pattern = shift; $self->[2] = $pattern; } return $self->[2]; }
sub silent { my $self = shift; return $self->[3]; }
sub add_bloom { my $self = shift; my $class = ref($self); my $var = shift; my $bloom = shift; my $l = Log::Log4perl->get_logger("rdf.query.algebra.service"); unless (blessed($var)) { $var = RDF::Query::Node::Variable->new( $var ); } my $pattern = $self->pattern; my $iri = RDF::Query::Node::Resource->new('http://kasei.us/code/rdf-query/functions/bloom/filter'); $l->debug("Adding a bloom filter (with " . $bloom->key_count . " items) function to a remote query"); my $frozen = $bloom->freeze; my $literal = RDF::Query::Node::Literal->new( $frozen ); my $expr = RDF::Query::Expression::Function->new( $iri, $var, $literal ); my $filter = RDF::Query::Algebra::Filter->new( $expr, $pattern ); return $class->new( $self->endpoint, $filter ); }
sub sse { my $self = shift; my $context = shift; my $prefix = shift || ''; my $indent = $context->{indent}; return sprintf( "(service\n${prefix}${indent}%s\n${prefix}${indent}%s)", $self->endpoint->sse( $context, "${prefix}${indent}" ), $self->pattern->sse( $context, "${prefix}${indent}" ) ); }
sub as_sparql { my $self = shift; my $context = shift; my $indent = shift; my $op = ($self->silent) ? 'SERVICE SILENT' : 'SERVICE'; my $string = sprintf( "%s %s %s", $op, $self->endpoint->as_sparql( $context, $indent ), $self->pattern->as_sparql( { %$context, force_ggp_braces => 1 }, $indent ), ); return $string; }
sub as_hash { my $self = shift; my $context = shift; return { type => lc($self->type), endpoint => $self->endpoint, pattern => $self->pattern->as_hash, }; }
sub type { return 'SERVICE'; }
sub referenced_variables { my $self = shift; my @list = $self->pattern->referenced_variables; return @list; }
sub potentially_bound { my $self = shift; return $self->pattern->potentially_bound; }
sub definite_variables { my $self = shift; return RDF::Query::_uniq( map { $_->name } grep { $_->isa('RDF::Query::Node::Variable') } ($self->graph), $self->pattern->definite_variables, ); }
sub qualify_uris { my $self = shift; my $class = ref($self); my $ns = shift; my $base_uri = shift; my $pattern = $self->pattern->qualify_uris( $ns, $base_uri ); my $endpoint = $self->endpoint; my $uri = $endpoint->uri; return $class->new( $endpoint, $pattern ); } 1; __END__