SPARQL:OFFSET没有ORDER BY来获取查询的所有结果?

时间:2018-01-29 11:39:37

标签: sparql jena tdb

我有一个大的TDB数据集(参见这篇文章Fuseki config for 2 datasets + text index : how to use turtle files?),我需要提取数据以制作一个"子图"并将其导入fuseki。 我发现如果这些结果太多(大约12M三元组),OFFSET可以成为获取查询结果的解决方案。

以下是问题

1)我在阅读W3C建议时OFFSET应与ORDER BY一起使用:

  

除非订单是,否则使用LIMIT和OFFSET(...)将无效   通过使用ORDER BY来实现可预测的

(参见https://www.w3.org/TR/rdf-sparql-query/#modOffset

- 不幸的是,ORDER BY似乎在我的数据集上非常长。我发现了一些OFFSET没有ORDER BY的例子(这里是Getting list of persons using SPARQL dbpedia),所以我试图单独使用OFFSET,它似乎有效。

- 我需要确保如果我重复相同的查询,我将获得所有结果。因此,我尝试了一个样本,并检查结果是否给出了不同的值和预期的数字,一切似乎都没问题。 所以我假设只有在2个查询之间修改数据集时才需要ORDER BY("可预测的顺序")?

2)性能是否取决于比率限制/偏移?

- 我试过LIMIT = 100,1000,5000,10000具有相同的偏移量,似乎速度几乎相同。

- 还尝试比较OFFSET的不同值,并且看起来大偏移的执行时间更长(但可能它只是TDB的一个问题:cf:https://www.mail-archive.com/users@jena.apache.org/msg13806.html)< / p>

~~~~~~ 更多信息 ~~~~~~

- 我使用带tdbquery的脚本和此命令:

./tdbquery --loc=$DATASET --time --results=ttl "$PREFIXES construct { ?exp dcterms:title ?titre } where { ?manif dcterms:title ?titre ; rdarelationships:expressionManifested ?exp } limit $LIMIT offset $OFFSET"

- 数据集:~168M三倍,带有dcterms的~12M三倍:标题。

~~~~~~~~~~~~~~~~~~~~~~

提前致谢

1 个答案:

答案 0 :(得分:2)

谢谢AKSW&amp; Andy,您的评论帮助我了解了Sparql。

所以我尝试使用SELECT REDUCED,但它很长,如果我不使用OFFSET,则无法停止该过程。此外,我需要转换结果以生成一个新图形(我想对作者进行其他转换等)。

我阅读了一些关于流,模型和序列化的页面,发现我可以直接使用同一查询中的多个更新来转换数据。这是一个潜在的解决方案:首先制作TDB文件的副本,然后在while循环中使用此查询:

DELETE {
    ?manif dcterms:title ?titre ;
        rdarelationships:expressionManifested ?exp   
}
INSERT { 
    graph <http://titres_1> { 
        ?manif rdarelationships:expressionManifested ?exp .
        ?exp dcterms:titre ?titre 
    }
} 
WHERE {  
    select * where 
        { 
            ?manif dcterms:title ?titre ;
                rdarelationships:expressionManifested ?exp 
        }
    LIMIT 100000 
}

此解决方案有几个优点:

  • 非常简单,没有java代码(我不知道Jena类和Java,现在没时间学习)也没有文件处理。
  • 我可以在需要时停止这个过程。
  • 每次删除结果都可以确保检索所有匹配的三元组
  • 每次删除后,默认图表会变小,因此查询应该越来越高效

也许可以提高效率:任何想法都会受到赞赏。

-----编辑----------

我已经开始转换数据,使用bash脚本重复查询,s-get ... | split导出.nt文件中的三元组。每次导出后,&#34; temp&#34;使用s-update清除图形。

一切似乎都没问题,

  1. 比我想象的更多时间(50 x查询约1小时,限制= 10 000)。
  2. 我的 TDB文件现在比我想象的要大得多。好像删除的三元组没有被真正删除(它们是存储在某些&#34;备份&#34;图形?还是只有索引被修改?)。转换前:默认图中约为168 300 000三倍,TDB文件为20,6 Go。现在:默认图表中为~155 100 000,文件中为55 Go ...
  3. 因此,有两个问题:

    • a)这是&#34;正常&#34;行为?我可以减小文件的大小(不仅是存储问题,我认为下次查询应该更快)?
    • b)您是否知道另一种方法,使用命令行实用程序可能会更快?

    提前致谢

    最后编辑

    文件大小和性能似乎取决于可在tdb.cfg文件中设置的参数:请参阅http://jena.apache.org/documentation/tdb/store-parameters.html

    我的数据集文件夹中没有任何.cfg文件。我做的第一个测试是添加一个并将tdb.file_mode更改为&#39;直接&#39; :似乎文件的大小不像以前一样增长。但是,它需要更多RAM并且查询速度更低(即使我增加了java -Xms和-Xmx)。我认为这是一个“权衡”的对象。文件大小和查询性能之间。如果我有时间,我会订阅jena-users邮件列表,询问最好的&#39;调整&#39;

    结论:测试查询很有意思,但我的数据集太大了;我将从具有命名图形的原始xml文件中创建另一个(但使用tdbloader2不允许这样做)或几个较小的数据集。