如何检索已保存的RDF :: Redland持久性存储?

时间:2013-02-01 14:47:10

标签: perl rdf persistent-storage redland

Redland库和Perl的RDF :: Redland绑定在创建持久存储和模型并将RDF / XML文件解析到其中时得到了很好的记录,例如here和{{ 3}}

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

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

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

这绝不打印。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

问题不在于检索商店,而在于保存它。这并不明显,因为三个Berkeley DB文件的重量共计366 MB。因此,在第一个脚本的末尾,就在undef存储和模型之前,需要将它们与$model->sync同步。

就是这样。

(之后伯克利文件的大小仍然完全相同,除非它有效。不要问我原因。)