1

Jena の TDB では、複数の「名前付きグラフ」を含むことができる「データセット」(ディレクトリで指定) によってデータが編成されているようです。

このようなデータをクエリする同時実行ポリシーに関して、同時実行に関連して私が見つけた唯一のドキュメントは、TDB ドキュメントの次の文TDB Java APIです。

同時アクセスのための複数リーダーまたは単一ライター (MRSW) ポリシーを使用すると、トランザクションなしでデータセットを直接操作できます。

ただし、そのような MRSW ポリシーの粒度についてはよくわかりません。データセット全体ですか、それともデータセット内の個々の名前付きグラフですか?

編集:より具体的には、私の要件は、読み取り操作なしで、異なる名前付きグラフ (各スレッドが異なる名前付きグラフに書き込む) に対して書き込みのみの更新を行いたいということですが、可能でしょうか? または、一度に 1 つのスレッドを更新する必要がありますか。

4

3 に答える 3

2

リンクされたドキュメントが言うことを考えると

同時アクセスのための複数リーダーまたは単一ライター (MRSW) ポリシーを使用すると、トランザクションなしでデータセットを直接操作できます。

データセットにアクセスするライターが複数ある場合は、名前が異なるグラフであっても、トランザクションを使用する必要があると思います。TDB トランザクションに関するドキュメントには、書き込みトランザクションについて次のように記載されています。

一般的なパターンは次のとおりです。

 dataset.begin(ReadWrite.WRITE) ;
 try {
   ...
   dataset.commit() ;
 } finally { 
   dataset.end() ; 
 }

これらの呼び出しはbeginend個々の名前付きグラフではなく、データセットに関連付けられています。

多くのトリプル ストア (TDB もこれに含まれると思います) は、名前付きグラフ内のトリプルをクワッド (しばしば単にクワッドと呼ばれます) として扱います。a b c名前付きグラフのトリプルは、名前付きグラフg1のトリプルと一緒に同じクワッド テーブルに格納できます。d e fg2

g1 a b c
g2 d e f

そして、単一のデータセットを表すこのクワッド テーブルは、4 つの列のいずれかにインデックスを付けることができます。この表現では、データの名前付きグラフ部分は、データの残りの部分と実際には何の違いもないため、名前付きグラフは同時実行の問題からの分離を提供しません。実際、一般に、SPARQL クエリと更新は複数の名前付きグラフから読み取ったり更新したりできるため、クエリや更新が接触する名前付きグラフを事前に知る方法はありません。

于 2013-09-23T21:25:15.637 に答える
1

どうやら、次のコードを書くことができます。

わかった。どうやら、次のコードを書くことができます。

Dataset dataset = TDBFactory.createDataset("demo");
Model model = dataset.getNamedModel("aModel");
try {
    model.enterCriticalSection(False);   //Write Lock

    // write triples to model

    model.commit();
    TDB.sync(model);
} finally {
    model.leaveCriticalSection();
}

これによると、異なる名前のグラフに同時に書き込みをしても問題はないと思います。ただし、これはまだテストされていません。

于 2013-09-24T14:54:16.990 に答える