use strict;
#use warnings;
package RDF::Notation3::RDFStore;
require 5.005_62;
use RDF::Notation3;
use RDFStore::NodeFactory;
use RDFStore::Model;
############################################################
@RDF::Notation3::RDFStore::ISA = qw(RDF::Notation3);
sub parse_file {
my ($self, $path) = @_;
$self->_do_error(1, '') unless @_ > 1;
$self->{factory} = RDFStore::NodeFactory->new();
$self->{model} = RDFStore::Model->new(%{$self->{options}});
$self->SUPER::parse_file($path);
return $self->{model};
}
sub parse_string {
my ($self, $str) = @_;
$self->_do_error(3, '') unless @_ > 1;
$self->{factory} = RDFStore::NodeFactory->new();
$self->{model} = RDFStore::Model->new(%{$self->{options}});
$self->SUPER::parse_string($str);
return $self->{model};
}
sub set_options {
my ($self, $options) = @_;
$self->{options} = $options;
}
sub _process_statement {
my ($self, $subject, $properties) = @_;
my $subject = $self->_expand_prefix($subject);
my $sub = $self->{factory}->createResource($subject);
foreach (@$properties) {
if ($_->[0] ne 'i') {
$_->[0] = $self->_expand_prefix($_->[0]);
for (my $i = 1; $i < scalar @$_; $i++ ) {
$_->[$i] = $self->_expand_prefix($_->[$i]);
my $pred = $self->{factory}->createResource($_->[0]);
my $obj;
if ($_->[$i] =~ /^"(.*)"$/) {
$obj = $self->{factory}->createLiteral($_->[$i]);
} else {
$obj = $self->{factory}->createResource($_->[$i]);
}
my $stat = $self->{factory}->createStatement($sub,$pred,$obj);
$self->{model}->add($stat);
}
} else {
# inverse mode (is, <-)
shift @$_;
$_->[0] = $self->_expand_prefix($_->[0]);
for (my $i = 1; $i < scalar @$_; $i++ ) {
$_->[$i] = $self->_expand_prefix($_->[$i]);
my $pred = $self->{factory}->createResource($_->[0]);
my $obj;
if ($_->[$i] =~ /^".*"$/) {
$self->_do_error(501, $_->[$i]);
} else {
$obj = $self->{factory}->createResource($_->[$i]);
}
my $stat = $self->{factory}->createStatement($sub,$pred,$obj);
$self->{model}->add($stat);
}
}
}
}
sub _expand_prefix {
my ($self, $qname) = @_;
foreach (keys %{$self->{ns}->{$self->{context}}}) {
$qname =~ s/^$_:(.*)$/$self->{ns}->{$self->{context}}->{$_}$1/;
}
if ($qname =~ /^([_a-zA-Z]\w*)*:[a-zA-Z]\w*$/) {
$self->_do_error(106, $qname);
}
$qname =~ s/^\<(.*)\>$/$1/;
return $qname;
}
1;
__END__
# Below is a documentation.
=head1 NAME
RDF::Notation3::RDFStore - creates a RDFStore model from an N3 file
=head1 LICENSING
Copyright (c) 2001 Ginger Alliance. All rights reserved. This program is free
software; you can redistribute it and/or modify it under the same terms as
Perl itself.
=head1 AUTHOR
Petr Cimprich, petr@gingerall.cz
=head1 SEE ALSO
perl(1), RDF::Notation3, RDFStore.
=cut