以编程方式查询芝麻时如何获得一致的结果序列?

How to get a consistent sequence of results when querying Sesame programmatically?

我有一些关于 Sesame triplestore 的数据。当我使用 GUI 查询它时,无论我查询多少次,返回的三元组序列都保持不变。当我以编程方式尝试相同的事情时,顺序不断变化(尽管结果相同)。有人可以解释为什么会这样吗?我可以做些什么来确保结果以相同的顺序返回?

这是我的代码:

sesameSparqlEndpoint = 'http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name'
sparql = SPARQLWrapper(sesameSparqlEndpoint)
queryStringDownload = 'SELECT * WHERE {?s ?p ?o} LIMIT 10 OFFSET 1000'
dataGraph = Graph()

sparql.setQuery(queryStringDownload)
sparql.method = 'GET'
sparql.setReturnFormat(JSON)
output = sparql.query().convert()
print output

SPARQL 查询 return 结果的顺序未定义,任何 SPARQL 引擎都可以完全自由地 return 结果以它认为合适的任何顺序。根据数据库的实现,以及它用于查询优化、序列化、索引、压缩等的技术,每次执行查询时,完全相同的查询的结果可能会有不同的顺序。

以上内容适用于任何 SPARQL 引擎,顺便说一下,不仅仅是芝麻。即使你发现一个数据库似乎每次都以相同的顺序 return 结果,这也不是你应该依赖的行为,因为它不能保证行为并且每当该数据库发布新版本时,它可能会突然改变。

但是,SPARQL 有一个内置运算符来影响 returned 结果的顺序:ORDER BY。如果您希望执行查询并确保结果按特定固定顺序 returned,则需要使用它。

TL;DR:调整您的 SPARQL 查询,如下所示:

SELECT * WHERE {?s ?p ?o} ORDER BY ?s LIMIT 10 OFFSET 1000

注意这个特定的查询可能非常昂贵。您要求数据库中的 all 三元组 - 即使您将最终结果限制为 10,它仍可能需要覆盖整个数据库的很大一部分才能正确排序结果。