RDF::Query::Algebra::Service - Algebra class for SERVICE (federation) patterns


RDF-Query documentation Contained in the RDF-Query distribution.

Index


Code Index:

NAME

Top

RDF::Query::Algebra::Service - Algebra class for SERVICE (federation) patterns

VERSION

Top

This document describes RDF::Query::Algebra::Service version 2.907.

METHODS

Top

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_args

Returns a list of arguments that, passed to this class' constructor, will produce a clone of this algebra pattern.

endpoint

Returns the endpoint resource of the named graph expression.

pattern

Returns the graph pattern of the named graph expression.

silent

Returns 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).

sse

Returns the SSE string for this algebra expression.

as_sparql

Returns the SPARQL string for this algebra expression.

as_hash

Returns the query as a nested set of plain data structures (no objects).

type

Returns the type of this algebra expression.

referenced_variables

Returns a list of the variable names used in this algebra expression.

potentially_bound

Returns a list of the variable names used in this algebra expression that will bind values during execution.

definite_variables

Returns 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.

AUTHOR

Top

 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__