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

时间:2015-12-22 18:20:43

标签: python sparql sesame rdflib linked-data

我在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

1 个答案:

答案 0 :(得分:2)

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

顺便说一下,任何 SPARQL引擎都是如此,而不仅仅是Sesame。即使您发现数据库似乎每次都以相同的顺序返回结果,这也不是您应该依赖的行为,因为它不会保证行为,并且每当该数据库发布新版本时,它可能会突然改变。

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

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

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

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