我在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
答案 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,它仍可能需要覆盖整个数据库的大部分才能正确排序结果