大写结果集的第一个字母

Capitalize the first letter of a result set

我有这个用于维基数据的 SPARQL 代码:

SELECT
  ?game
  (group_concat(distinct      ?gameLabel ; separator = ", ") AS      ?gameLabels)
  (group_concat(distinct     ?genreLabel ; separator = ", ") AS     ?genreLabels)
  WHERE {
    ?game wdt:P31 wd:Q7889;
    wdt:P136 wd:Q744038.
    OPTIONAL {?game wdt:P136     ?genre}
    SERVICE wikibase:label {
      bd:serviceParam wikibase:language "en".
           ?game rdfs:label      ?gameLabel.
          ?genre rdfs:label     ?genreLabel.
    }
  }
GROUP BY $game
ORDER BY ASC (?gameLabels)

您可以在此处测试代码:

https://query.wikidata.org/

假设 ?genreLabel 默认总是小写。如何将每个返回值的首字母大写?谢谢

这就是 Wikidata 的神奇标签 SERVICE 使事情变得复杂的关键所在,因为您不能在 BIND 部分中使用它们 - 或者至少我不知道如何使用它们:

SELECT
  ?game
  (group_concat(distinct      ?gameLabel ; separator = ", ") AS      ?gameLabels)
  (group_concat(distinct     ?genreL ; separator = ", ") AS     ?genreLabels)

  WHERE {
    ?game wdt:P31 wd:Q7889 ;
          wdt:P136 wd:Q744038 .
    OPTIONAL {
       ?game wdt:P136     ?genre. 
       ?genre rdfs:label ?gL. 
       FILTER(LANGMATCHES(LANG(?gL), "en"))
    }
    BIND(CONCAT(UCASE(SUBSTR(?gL, 1, 1)), SUBSTR(?gL, 2)) as ?genreL)

    SERVICE wikibase:label {
      bd:serviceParam wikibase:language "en".
           ?game rdfs:label      ?gameLabel.
    }

  }
GROUP BY ?game
ORDER BY ASC (?gameLabels)

思路如下:

  • 取标签的第一个字符:SUBSTR(?gL, 1, 1)
  • 对其应用大写运算符:UCASE(SUBSTR(?gL, 1, 1))
  • 从第二个字符开始获取整个字符串:SUBSTR(?gL, 2))
  • 连接两个部分:CONCAT(UCASE(SUBSTR(?gL, 1, 1)), SUBSTR(?gL, 2))

请注意,在某些时候,在客户端进行字符串修改和样式设置可能会更容易...