SPARQL内层查询中带日期的多重排序失效问题
这是SPARQL的标准预期行为,不存在遗漏配置的问题。
SPARQL规范中,仅最外层查询的ORDER BY子句会保证最终返回结果的排序顺序。子查询内部的ORDER BY如果没有搭配LIMIT/OFFSET这类截断结果的操作,其排序结果不会被外层查询保留:因为SPARQL的解决方案集合本质上是无序的,查询引擎没有义务保留内层无截断场景下的排序状态。
你当前的写法把排序逻辑写在了子查询内部,且没有配合LIMIT使用,Wikidata Query Service底层使用的Blazegraph引擎会直接忽略这类无效的内层排序,所以返回结果呈现随机排序的状态。
如果要实现你预期的排序效果,把ORDER BY逻辑移到最外层即可,参考写法如下:
SELECT ?s ?birthyear WHERE { SELECT ?s ?birthyear WHERE { ?s wdt:P27 wd:Q837 . ?s wdt:P106 wd:Q33999 . ?s wdt:P569 ?dateOfBirth . BIND(YEAR(?dateOfBirth) as ?birthyear) } } ORDER BY ASC(?birthyear) ASC(?s)
如果你确实需要在内层先完成排序(例如要先取每年出生的前N个演员再做后续处理),只需要在内层ORDER BY后添加对应的LIMIT值,排序状态就会被外层保留。
内容的提问来源于stack exchange,提问作者kailashthakuri
相关产品推荐
相关产品推荐

