大写结果集的第一个字母

时间:2017-05-28 09:06:17

标签: sparql capitalization wikidata

我有这个适用于维基数据的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始终为小写。如何将每个返回值的首字母大写?感谢。

1 个答案:

答案 0 :(得分:1)

因为你不能在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))

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