如何解决如何仅从可选属性中获取第一个值? 使用示例使用过滤器
就像在 sql 聚合 MAX、MIN 或 FirsT 中一样,它只获取一个值,而不是重复行。
真实的维基数据案例
OPTIONAL 子句从 253 行扩展到 257 行:
<settings>:
name: "screen_settings"
GridLayout:
cols: 2
rows: 1
Label:
text: 'skip'
CheckBox:
active: root.skipbool
on_active: root.skiplogin_click(self,self.active)
我只需要一个(任意)# Countries and its codes
SELECT ?code ?item ?itemLabel ?osmId
WHERE
{
?item wdt:P297 ?code.
OPTIONAL{?item wdt:P402 ?osmId .}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?code
。
如何做像osmId
这样的事情?
注意:
- 它不是 How to get only the most recent value from a Wikidata property? 的副本
- 它不是 Why does this Wikidata SPARQL query only work for the first element in a list? 的副本
- ...并不完全需要简单“任何第一”。
解决方法
这是一个 WIKI 答案(请您可以编辑以增强此答案!)
# Countries and its codes
SELECT ?code ?item ?itemLabel
(MAX(?osmId) as ?osmId_max) (COUNT(?code) as ?osmId_n)
WHERE
{
?item wdt:P297 ?code.
OPTIONAL{?item wdt:P402 ?osmId .}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?code ?item ?itemLabel
ORDER BY ?code
COUNT(?code)
仅用于检查 osmId
不是唯一 ID 的行。
仅过滤第一个选项的其他简单解决方案?
使用示例
作为@ValerioCocchi 的建议,我们可以使用 SAMPLE 代替 MAX:
SELECT ?code ?item ?itemLabel (SAMPLE(?osmId) as ?osmId_sample)
WHERE
{
?item wdt:P297 ?code.
OPTIONAL{?item wdt:P402 ?osmId .}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?code ?item ?itemLabel
ORDER BY ?code
SAMPLE 使用更少的 CPU 时间,但使用的主要动机是当您不关心返回哪个值时。就维基数据而言,当属性值是唯一的但存在一些(最小)错误时,您可以忽略它们。
关于 osmId
的注意事项:MAX 在这个特定查询中的优点是,使用与时间序列相关的数字 ID,它可以是一个“更新鲜”的 ID。 . 但是在 OpenStreetMap (OSM) 中,策略可以是相反的:最旧的是最稳定的 ID。因此,SAMPLE 在对更好的策略一无所知的情况下也是有意义的。
使用过滤器
@StanislavKralin 的建议:
SELECT ?code ?item ?itemLabel ?osmId
WHERE
{
?item wdt:P297 ?code.
OPTIONAL{
?item wdt:P402 ?osmId
FILTER NOT EXISTS {
?item wdt:P402 ?osmId,?osmId_ .
FILTER (?osmId_ > ?osmId)
}
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?code
看起来更冗长。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。