我在芝麻三元组上有一些数据。当我使用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查询返回结果的顺序是不确定的,并且任何SPARQL引擎完全可以自由选择以其认为合适的顺序返回结果。取决于数据库的实现及其用于查询优化,序列化,索引编制,压缩等的技术,每次执行查询时,完全相同的查询的结果可能会以不同的顺序排列。

顺便说一下,以上内容适用于所有SPARQL引擎,而不仅仅是芝麻。即使您发现每次看起来似乎都以相同顺序返回结果的数据库,也不是您应该依靠的行为,因为这不能保证行为,并且只要该数据库发布新版本,它就可能突然改变。

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

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

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


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

10-01 02:17
查看更多