RDF::Query::Algebra::Triple - Algebra class for Triple patterns


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

Index


Code Index:

NAME

Top

RDF::Query::Algebra::Triple - Algebra class for Triple patterns

VERSION

Top

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

METHODS

Top

Beyond the methods documented below, this class inherits methods from the RDF::Query::Algebra class.

new ( $s, $p, $o )

Returns a new Triple structure.

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

as_spin ( $model )

Adds statements to the given model to represent this algebra object in the SPARQL Inferencing Notation (http://www.spinrdf.org/).

referenced_blanks

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

subsumes ( $pattern )

Returns true if the triple subsumes the pattern, false otherwise.

bf ()

Returns a string representing the state of the nodes of the triple (bound or free).

distinguish_bnode_variables

Returns a new Quad object with blank nodes replaced by distinguished variables.

label ( $label => $value )

Sets the named $label to $value for this triple object. If no $value is given, returns the current label value, or undef if none exists.

AUTHOR

Top

 Gregory Todd Williams <gwilliams@cpan.org>


RDF-Query documentation Contained in the RDF-Query distribution.
# RDF::Query::Algebra::Triple
# -----------------------------------------------------------------------------

package RDF::Query::Algebra::Triple;

use strict;
use warnings;
no warnings 'redefine';
use base qw(RDF::Query::Algebra RDF::Trine::Statement);

use Data::Dumper;
use Log::Log4perl;
use Scalar::Util qw(refaddr);
use Carp qw(carp croak confess);
use Scalar::Util qw(blessed reftype refaddr);
use Time::HiRes qw(gettimeofday tv_interval);
use RDF::Trine::Iterator qw(smap sgrep swatch);

######################################################################

our ($VERSION);
my %TRIPLE_LABELS;
my @node_methods	= qw(subject predicate object);
BEGIN {
	$VERSION	= '2.907';
}

######################################################################

sub new {
	my $class	= shift;
	my @nodes	= @_;
	foreach my $i (0 .. 2) {
		unless (defined($nodes[ $i ])) {
			$nodes[ $i ]	= RDF::Query::Node::Variable->new($node_methods[ $i ]);
		}
		if (blessed($nodes[ $i ]) and not($nodes[ $i ]->isa('RDF::Query::Node'))) {
			$nodes[ $i ]	= RDF::Query::Node->from_trine( $nodes[ $i ] );
		}
	}
	return $class->_new( @nodes );
}

sub _new {
	my $class	= shift;
	return $class->SUPER::new( @_ );
}

sub as_sparql {
	my $self	= shift;
	my $context	= shift;
	my $indent	= shift;
	
	my $pred	= $self->predicate;
	if ($pred->isa('RDF::Trine::Node::Resource') and $pred->uri_value eq 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type') {
		$pred	= 'a';
	} else {
		$pred	= $pred->as_sparql( $context );
	}
	
	my $subj	= $self->subject->as_sparql( $context );
	my $obj		= $self->object->as_sparql( $context );
	my $string	= sprintf(
		"%s %s %s .",
		$subj,
		$pred,
		$obj,
	);
	return $string;
}

sub as_hash {
	my $self	= shift;
	my $context	= shift;
	return {
		type 	=> lc($self->type),
		nodes	=> [ map { $_->as_hash } $self->nodes ],
	};
}

sub as_spin {
	my $self	= shift;
	my $model	= shift;
	my $spin	= RDF::Trine::Namespace->new('http://spinrdf.org/spin#');
	my $t		= RDF::Query::Node::Blank->new();
	my @nodes	= $self->nodes;
	foreach (@nodes) {
		if (blessed($_) and $_->isa('RDF::Trine::Node::Variable')) {
			$_	= RDF::Query::Node::Blank->new( "variable_" . $_->name );
		}
	}
	
	$model->add_statement( RDF::Trine::Statement->new($t, $spin->subject, $nodes[0]) );
	$model->add_statement( RDF::Trine::Statement->new($t, $spin->predicate, $nodes[1]) );
	$model->add_statement( RDF::Trine::Statement->new($t, $spin->object, $nodes[2]) );
	return $t;
}

sub referenced_blanks {
	my $self	= shift;
	my @nodes	= $self->nodes;
	my @blanks	= grep { Carp::confess Dumper($_) unless blessed($_); $_->isa('RDF::Trine::Node::Blank') } @nodes;
	return map { $_->blank_identifier } @blanks;
}

sub subsumes {
	my $self	= shift;
	my $pattern	= shift;
	return 0 unless ($pattern->isa('RDF::Trine::Statement'));
	foreach my $method (@node_methods) {
		my $snode	= $self->$method();
		next if ($snode->isa('RDF::Trine::Node::Variable'));
		my $pnode	= $pattern->$method();
		next if ($snode->equal( $pnode ));
		return 0;
	}
	return 1;
}

sub bf {
	my $self	= shift;
	my $bf		= '';
	foreach my $n ($self->nodes) {
		$bf		.= ($n->isa('RDF::Query::Node::Variable'))
				? 'f'
				: 'b';
	}
	return $bf;
}

sub distinguish_bnode_variables {
	my $self	= shift;
	my $class	= ref($self);
	my @nodes	= $self->nodes;
	foreach my $i (0 .. $#nodes) {
		if ($nodes[$i]->isa('RDF::Query::Node::Blank')) {
			$nodes[$i]	= $nodes[$i]->make_distinguished_variable;
		}
	}
	return $class->new( @nodes );
}

sub _from_sse {
	my $class	= shift;
	return RDF::Trine::Statement->from_sse( @_ );
}

sub label {
	my $self	= shift;
	my $addr	= refaddr($self);
	my $label	= shift;
	if (@_) {
		my $value	= shift;
		$TRIPLE_LABELS{ $addr }{ $label }	= $value;
	}
	if (exists $TRIPLE_LABELS{ $addr }) {
		return $TRIPLE_LABELS{ $addr }{ $label };
	} else {
		return;
	}
}

sub DESTROY {
	my $self	= shift;
	my $addr	= refaddr( $self );
	delete $TRIPLE_LABELS{ $addr };
}

1;

__END__