Conclave-OTK
view release on metacpan or search on metacpan
lib/Conclave/OTK/Backend/File.pm view on Meta::CPAN
use strict;
use warnings;
package Conclave::OTK::Backend::File;
# ABSTRACT: OTK file based backend
use parent qw/Conclave::OTK::Backend/;
use RDF::Trine;
use RDF::Trine::Model;
use RDF::Trine::Parser;
use RDF::Trine::Store::Memory;
use RDF::Trine::Serializer::RDFXML;
use RDF::Query;
use Path::Tiny;
use Data::Dumper;
$ENV{PATH} = undef;
sub new {
my ($class, $base_uri, %opts) = @_;
my $self = bless({}, $class);
my $filename = 'model.xml';
$filename = $opts{filename} if $opts{filename};
$self->{base_uri} = $base_uri;
$self->{filename} = $filename;
return $self;
}
#my $store = RDF::Trine::Store::Memory->new;
#my $model = RDF::Trine::Model->new($store);
#my $serializer = RDF::Trine::Serializer::NQuads->new();
sub init {
my ($self, $rdfxml) = @_;
my $store = RDF::Trine::Store::Memory->new;
my $model = RDF::Trine::Model->new($store);
my $parser = RDF::Trine::Parser->new('rdfxml');
my $serializer = RDF::Trine::Serializer::RDFXML->new( base_uri => $self->{base_uri} );
$parser->parse_into_model($self->{base_uri}, $rdfxml, $model);
open(my $fh, '>', $self->{filename});
$serializer->serialize_model_to_file($fh, $model);
close($fh);
}
sub update {
my ($self, $sparql) = @_;
my $query = RDF::Query->new($sparql, {update => 1});
my $parser = RDF::Trine::Parser->new('rdfxml');
my $serializer = RDF::Trine::Serializer::RDFXML->new( base_uri => $self->{base_uri} );
my $file = path($self->{filename});
my $data = $file->slurp_utf8;
my $store = RDF::Trine::Store::Memory->new;
my $model = RDF::Trine::Model->new($store);
$parser->parse_into_model($self->{base_uri}, $data, $model);
my $iterator = $query->execute($model);
open(my $fh, '>', $self->{filename});
$serializer->serialize_model_to_file($fh, $model);
close($fh);
return $iterator;
}
sub query {
my ($self, $sparql) = @_;
my $query = RDF::Query->new($sparql);
my $parser = RDF::Trine::Parser->new('rdfxml');
my $file = path($self->{filename});
my $data = $file->slurp_utf8;
my $store = RDF::Trine::Store::Memory->new;
my $model = RDF::Trine::Model->new($store);
$parser->parse_into_model($self->{base_uri}, $data, $model);
my $iterator = $query->execute($model);
my @result;
while (my $triple = $iterator->next) {
if (scalar(keys %$triple) == 1) {
foreach (keys %$triple) {
push @result, $triple->{$_}->[1]; # FIXME
}
}
else {
# FIXME
my $str = $triple->as_string;
if ($str =~ m/{\s*.*?=<(.*?)>,\s*.*?=<(.*?)>,\s*.*?=("|<)(.*?)("|>)/) {
push @result, [($1,$2,$4)];
}
}
}
return @result;
}
sub delete {
my ($self) = @_;
unlink $self->{filename};
}
1;
( run in 0.869 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )