0

7MB と ~ 80k のステートメントを含む RDF ファイルがあります。

アプリケーションを起動すると、ユーザーに表示する必要がある itens のリストを取得する次のコードがあります。

           NodeIterator iterator = technologyModel.listObjectsOfProperty(subject);
           while (iterator.hasNext()) {
               RDFNode node = iterator.nextNode();
               myCollection.add(node.asLiteral().getString().trim());
           }

注: このコードは正常に動作し、約 3,000 の結果を返します。これは、「technologyModel」に初めてアクセスしたときです。

明らかに、それを行う前に、データセット/モデルをロードする必要があります。ここに問題があります。

ケース (1) RDF ファイルからデータセット/モデルをロードすると、次のようになります。

    InputStream in = FileManager.get().open(ParamsHelper.sourceRDF);
    technologyModel.read(in, "RDF/XML-ABBREV");

technologyModel は即座に読み込まれ、投稿された最初のコードは 1 秒もかからずに実行されます。

ケース (2) ただし、TDB データベース (最初のケースで使用したのと同じ RDF ファイルを以前にロードしたもの) からモデルをロードしようとすると、次のコードが使用されます。

    dataset = TDBFactory.createDataset(ParamsHelper.tdbBaseDir);
    dataset.begin(ReadWrite.READ) ;
    technologyModel = dataset.getNamedModel("http://a.example.biz/technology");
    dataset.end();

technologyModel はすぐにはロードされないようで、投稿された最初のコードが期待どおりに返されたとしても、最初の呼び出しで約 30 秒で実行されます。

最初に同じコードを呼び出した場合、またはたとえば、このコードを初めて呼び出す前に technologyModel.listSubjects() のような別の操作を挿入した場合、予想どおりすぐに実行されます。

2 番目のケースでは、モデルが実際に読み込まれるのは、最初の操作が行われた後であるようです。意味はありますか?

データを RDF ファイルに保存するのではなく、トリプルを格納する TDB データベースを使用したいと考えています。そのため、2 番目のオプションの方が適しているように思われます。

誰でもこれについて私を助けることができますか? 問題を正しく公開できれば幸いです。

前もって感謝します。

4

1 に答える 1

2

ここには 2 つの効果があります。

TDBFactory.createDatasetデータをロードしません - データベースに接続します。データは使用時にメモリにロード (キャッシュ) されるためlistObjectsOfProperty、初めて実行するときは、すべてのキャッシュがコールドであり、データベースが遅くなる可能性があります。この時点で実行しているハードウェアに非常に敏感です。

2 つ目は、モデル API 呼び出しがデータベースに適していないアクセス パターンを持つ可能性があることです。データセットで SPARQL を使用することをお勧めします。

ところで、listObjectsOfPropertyサブジェクトを取りません。プロパティを取り、多くのデータベースにアクセスできます。myCollection がセットの場合、3K を超えるアイテムを追加する可能性があります。

于 2015-02-09T20:47:41.243 に答える