Как получить сохраненное хранилище 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
,
Вот и все.
(И после этого файлы Беркли по-прежнему имеют точно такой же размер, за исключением того, что они работают. Не спрашивайте меня, почему.)