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" }
  }  
}

在这里试试:Link

结果如下:

enter image description here

完美运行。但是第 2 行和第 3 行是相同的货币。该货币仅对细分使用多个名称。我希望它们连接起来,所以我得到了这个输出

enter image description here

这可能吗?

解决方法

SPARQL 中的分组工作类似于 SQL。 函数 GROUP BY 将具有相同值的结果组合成组。然后,将聚合函数应用于每个组的其他(不同的)值。

典型的聚合函数有 COUNTSUMMINMAXAVGGROUP_CONCATSAMPLE

对您来说,GROUP_CONCAT 很有趣。它跨组的值执行字符串连接。使用参数 separator 您甚至可以指定分隔符。字符串的顺序是任意的。

GROUP BYGROUP_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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...