首页 文章

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

提问于
浏览
1

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

这是我的 questions

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

除非通过使用ORDER BY使订单可预测,否则使用LIMIT和OFFSET(...)将没有用 .

(参见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) 性能是否取决于比率限制/偏移?

~~~~~~ more info ~~~~~~

  • 我使用带有 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三倍: Headers .

提前致谢

1 回答

  • 2

    谢谢AKSW和Andy,您的评论帮助我了解了Sparql .

    所以我尝试使用 SELECT REDUCED ,但是如果我不使用 OFFSET 则会停止's very long and the process can' . 此外,我需要转换结果以生成一个新图形(我想对作者进行其他转换等) .

    我阅读了一些关于流,模型和序列化的页面,发现我可以直接使用同一查询中的多个更新来转换数据 . 这是一个潜在的解决方案:首先制作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文件中的三元组 . 每次导出后,将使用s-update清除"temp"图形 .

    一切似乎都没问题, but

    • 需要 more time 比我想象的那样(对于50 x查询,大约1小时,限制= 10 000) .

    • TDB files are now much bigger 比我想象的还要好 . 好像删除的三元组没有被真正删除(它们存储在某些"backup"图形中?或者可能只修改了索引?) . 转换前:默认图中约为168 300 000三倍,TDB文件为20,6 Go . 现在:默认图表中约为155 100 000,文件中为55 Go ...

    因此,2个问题:

    • a)这是"normal"的行为吗?我可以 reduce the size of the files (不仅是存储问题,我认为下次查询应该更快)?

    • b)您是否知道 another method ,使用命令行实用程序,可能更快?

    提前致谢


    最后的编辑

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

    我的数据集文件夹中没有任何.cfg文件 . 我做的第一个测试是添加一个并将 tdb.file_mode 更改为'direct':文件大小似乎在文件大小和查询性能之间没有'tradeoff' . 如果我有时间,那么'll subscribe on jena-users mailing list to ask what'是最好的'tuning' .

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

相关问题