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;
}
这绝不打印。
感谢您的帮助!
答案 0 :(得分:1)
我找到了解决自己问题的方法,我感到非常愚蠢,失去了那么多个小时。所以,如果这可以帮助其他人经历同样的地狱,那么就是这样。
问题不在于检索商店,而在于保存它。这并不明显,因为三个Berkeley DB文件的重量共计366 MB。因此,在第一个脚本的末尾,就在undef
存储和模型之前,需要将它们与$model->sync
同步。
就是这样。
(之后伯克利文件的大小仍然完全相同,除非它有效。不要问我原因。)