如何解决SPARQL - 多行上的连接值
我想要一份萨尔瓦多所有货币及其细分的列表。
我使用这个查询:
SELECT ?currency ?currencyLabel ?currencyIso4217 ?subdivisionLabel {
?currency wdt:P498 ?currencyIso4217 .
?currency wdt:P9059 ?subdivision .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
{
?country wdt:P38 ?currency .
BIND(wd:Q792 AS ?country).
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
}
结果如下:
完美运行。但是第 2 行和第 3 行是相同的货币。该货币仅对细分使用多个名称。我希望它们连接起来,所以我得到了这个输出:
这可能吗?
解决方法
SPARQL 中的分组工作类似于 SQL。
函数 GROUP BY
将具有相同值的结果组合成组。然后,将聚合函数应用于每个组的其他(不同的)值。
典型的聚合函数有 COUNT
、SUM
、MIN
、MAX
、AVG
、GROUP_CONCAT
和 SAMPLE
。
对您来说,GROUP_CONCAT
很有趣。它跨组的值执行字符串连接。使用参数 separator
您甚至可以指定分隔符。字符串的顺序是任意的。
GROUP BY
和 GROUP_CONCAT
的语法已在 UninformedUser 的评论中提供给您,但我在这里以稍微调整的形式重复一遍:
SELECT ?currency ?currencyLabel ?currencyIso4217 (GROUP_CONCAT(?subdivisionLabel; separator = ",") as ?subdivisionLabels) {
BIND(wd:Q792 AS ?country).
?country wdt:P38 ?currency .
?currency wdt:P498 ?currencyIso4217 .
?currency wdt:P9059 ?subdivision .
?subdivision rdfs:label ?subdivisionLabel .
FILTER(lang(?subdivisionLabel) = 'en')
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} GROUP BY ?currency ?currencyLabel ?currencyIso4217
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。