0

我有一个包含 7MB 和 ~ 80k 语句的 RDF 文件。

启动应用程序时,我有以下代码,它检索我需要向用户显示的项目列表:

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

注意:这段代码工作得很好,并返回了大约 3k 的结果,并且是第一次访问“technologyModel”。

显然,在此之前,我必须加载数据集/模型,这就是问题所在。

案例 (1) 当我从 RDF 文件加载数据集/模型时,执行以下操作:

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

technologyModel 似乎立即加载,并且发布的第一个代码在不到一秒的时间内运行。

案例 (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(),它将按预期立即运行。

在我看来,在第二种情况下,模型实际上只在它遭受的第一次操作之后才加载。这有什么意义吗?

我不想将我的数据保存在 RDF 文件中,而是希望有一个 TDB 数据库来存储三元组。这就是为什么第二个选项似乎更适合我的原因。

谁可以帮我这个事?我希望我能正确地揭露问题。

提前致谢。

4

1 回答 1

2

这里有两个效果:

TDBFactory.createDataset不加载任何数据 - 它连接到数据库。数据在使用时被加载到内存中(缓存),所以当你第一次做listObjectsOfProperty的时候,所有的缓存都是冷的,数据库可能很慢。此时它将对您正在运行的硬件非常敏感。

第二个是模型 API 调用可以具有对数据库不友好的访问模式。最好在数据集上使用 SPARQL。

顺便说一句:listObjectsOfProperty不接受主题 - 它接受一个属性并且可以访问很多数据库。如果 myCollection 是一个集合,那么您添加的项目可能比 3K 多得多。

于 2015-02-09T20:47:41.243 回答