Attean
view release on metacpan or search on metacpan
lib/Attean/API/Model.pm view on Meta::CPAN
}
my $planner = Attean::IDPQueryPlanner->new();
my $plan = $planner->plan_for_algebra($algebra, $self, $default_graphs);
my $iter = $plan->evaluate($self);
my $r = $iter->next;
my $ebv = eval { $r->ebv };
return 0 if ($@);
return $ebv;
}
sub holds {
my $self = shift;
return 0 unless scalar(@_);
if (not defined($_[0]) or (blessed($_[0]) and $_[0]->does('Attean::API::TermOrVariable'))) {
# firt argument is undef or a term/variable, so we assume this is a call with up to 3 term/variable/undef args
return ($self->count_quads_estimate(@_) > 0);
} elsif (blessed($_[0]) and $_[0]->does('Attean::API::TripleOrQuadPattern')) {
my $t = shift;
return ($self->count_quads_estimate($t->values) > 0);
} else {
die "Unexpected argument to holds: " . Dumper($_[0]);
}
}
}
package Attean::API::MutableModel 0.039 {
use Attean::RDF;
use LWP::UserAgent;
use Encode qw(encode);
use Scalar::Util qw(blessed);
use Role::Tiny ();
use Moo::Role;
requires 'add_quad';
requires 'remove_quad';
requires 'create_graph';
requires 'drop_graph';
requires 'clear_graph';
requires 'add_iter';
with 'Attean::API::Model';
sub load_urls_into_graph {
my $self = shift;
my $graph = shift;
my @urls = @_;
my $ua = LWP::UserAgent->new();
my $accept = Attean->acceptable_parsers( handles => 'Attean::API::Triple' );
$ua->default_headers->push_header( 'Accept' => $accept );
foreach my $u (@urls) {
my $url = blessed($u) ? $u->value : $u;
my $resp = $ua->get($url);
if ($resp->is_success) {
my $ct = $resp->header('Content-Type');
my $pclass = Attean->get_parser( media_type => $ct, filename => $url ) // Attean->get_parser('ntriples');
if ($pclass) {
my $p = $pclass->new(base => iri($url));
my $str = $resp->decoded_content;
my $bytes = encode('UTF-8', $str, Encode::FB_CROAK);
my $iter = eval { $p->parse_iter_from_bytes( $bytes ) };
if ($@) {
die "Failed to parse URL $url: $@";
}
$self->add_iter($iter->as_quads($graph));
} else {
die "No parser found for content type $ct: $url";
}
} else {
die $resp->status_line;
}
}
}
# $model->load_triples( 'turtle', iri('http://example.org/graph1') => "@prefix foaf: ...", iri('http://example.org/graph2') => "@prefix foaf: ..." );
sub load_triples {
my $self = shift;
my $format = shift;
my $class = Attean->get_parser($format) || die "Failed to load parser for '$format'";
my $parser = $class->new() || die "Failed to construct parser for '$format'";
while (scalar(@_)) {
my ($graph, $string) = splice(@_, 0, 2);
my $iter = $parser->parse_iter_from_bytes(encode('UTF-8', $string, Encode::FB_CROAK));
my $quads = $iter->as_quads($graph);
$self->add_iter($quads);
}
}
sub load_triples_from_io {
my $self = shift;
my $format = shift;
my $class = Attean->get_parser($format) || die "Failed to load parser for '$format'";
my $parser = $class->new() || die "Failed to construct parser for '$format'";
while (scalar(@_)) {
my ($graph, $fh) = splice(@_, 0, 2);
my $iter = $parser->parse_iter_from_io($fh);
my $quads = $iter->as_quads($graph);
$self->add_iter($quads);
}
}
sub add_iter {
my $self = shift;
my $iter = shift;
my $type = $iter->item_type;
die "Iterator type $type isn't quads" unless (Role::Tiny::does_role($type, 'Attean::API::Quad'));
while (my $q = $iter->next) {
$self->add_quad($q);
}
}
sub add_list {
my $self = shift;
die "add_list called without a graph name" unless (scalar(@_));
my $graph = shift;
my @elements = @_;
my $rdf_first = Attean::IRI->new('http://www.w3.org/1999/02/22-rdf-syntax-ns#first');
my $rdf_rest = Attean::IRI->new('http://www.w3.org/1999/02/22-rdf-syntax-ns#rest');
my $rdf_nil = Attean::IRI->new('http://www.w3.org/1999/02/22-rdf-syntax-ns#nil');
( run in 0.938 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )