0

在创建持久存储和模型并将 RDF/XML 文件解析到其中时,Perl 的 Redland 库和 RDF::Redland 绑定有很好的文档,例如这里这里。

另一方面,我找不到任何关于如何从我的持久存储中检索模型的示例,并且明显的方法不起作用。

这就是我创建商店的方式:

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";

这有效并告诉我我有 300k 的声明。

然后我尝试用另一个脚本检索这些数据:

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;
}

这绝对不会打印任何内容。

谢谢你的帮助!

4

1 回答 1

1

我找到了解决自己问题的方法,为此浪费了这么多小时,我感到非常愚蠢。因此,如果这可以帮助其他人经历同样的地狱,那就是。

问题不在于检索商店,而在于保存它。这并不明显,因为三个 Berkeley DB 文件加起来有 366 MB。因此,在第一个脚本结束时,就在undef存储和模型之前,需要将它们与$model->sync.

就是这样。

(之后伯克利文件的大小仍然完全相同,只是它可以工作。不要问我为什么。)

于 2013-02-05T10:33:27.460 回答