0

Redland ライブラリと Perl の RDF::Redland バインディングは、永続ストアとモデルを作成し、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";

これは機能し、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

私は自分自身の問題の解決策を見つけましたが、それで何時間も失って信じられないほど愚かだと感じています. それで、それが同じ地獄を経験している他の誰かを助けることができるなら、ここにあります.

問題はストアを取得することではなく、保存することです。3 つの Berkeley DB ファイルを合わせると 366 MB になるため、これは明らかではありませんでした。したがって、最初のスクリプトの最後で、ストレージとモデルを 'ing する直前に、undefそれらを と同期する必要があります$model->sync

それでおしまい。

(その後も、Berkeley ファイルは、機能することを除けば、まったく同じサイズのままです。理由は聞かないでください。)

于 2013-02-05T10:33:27.460 に答える