Как получить сохраненное хранилище RDF::Redland?

Библиотека Redland и привязки RDF::Redland для Perl очень хорошо документированы, когда дело доходит до создания постоянного хранилища и модели и анализа файла RDF/XML в нем, например, здесь и здесь.

С другой стороны, я не могу найти ни одного примера о том, как извлечь модель из моего постоянного хранилища, и очевидный способ не работает.

Вот как я создал магазин:

my $storage =
  new RDF::Redland::Storage( "hashes", "test",
    "new='yes',hash-type='bdb',dir='data'" )
  or die "Failed to create RDF::Redland::Storage\n";

my $model = new RDF::Redland::Model( $storage, "" )
  or die "Failed to create RDF::Redland::Model for storage\n";

my $uri = new RDF::Redland::URI("file:test.rdf");

my $parser = new RDF::Redland::Parser( "rdfxml", "application/rdf+xml" )
  or die "Failed to find parser\n";

my $stream = $parser->parse_as_stream( $uri, $uri );
my $count = 0;
while ( !$stream->end ) {
    $model->add_statement( $stream->current );
    $count++;
    $stream->next;
}

$stream = undef;
$storage = undef;
$model   = undef;

print "Done. There were $count statements.\n";

Это работает и информирует меня о том, что у меня есть 300-тысячные заявления.

Затем я пытаюсь получить эти данные с помощью другого сценария:

my $storage =
  new RDF::Redland::Storage( "hashes", "test",
    "hash-type='bdb',dir='data'" )
  or die "Failed to create RDF::Redland::Storage\n";

my $model = new RDF::Redland::Model( $storage, "" )
  or die "Failed to create RDF::Redland::Model for storage\n";

$model->sync; # tried with and without this line

my $stream = $model->as_stream;
while ( !$stream->end ) {
    print "Statement: ", $stream->current->as_string, "\n";
    $stream->next;
}

Это ничего не печатает.

Спасибо за любую помощь!

1 ответ

Решение

Я нашел решение своей проблемы и чувствую себя невероятно глупо, теряя так много часов из-за этого. Так что, если это может помочь кому-то еще пройти через тот же ад, вот оно.

Проблема не в извлечении магазина, а в его сохранении. Это не было очевидно, потому что три файла Berkeley DB весят 366 МБ вместе. Так что в конце первого сценария, как раз перед undefПри использовании хранилища и модели необходимо синхронизировать их с $model->sync,

Вот и все.

(И после этого файлы Беркли по-прежнему имеют точно такой же размер, за исключением того, что они работают. Не спрашивайте меня, почему.)

Другие вопросы по тегам