2017-05-28 111 views
0

我有一個,就是對維基數據工作,此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

這就是事情變得與維基數據的魔力標籤服務複雜的,因爲你不能在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))

注意,在某些時候,它可能是更容易做在客戶端字符串修改和造型...

+0

這是有點題外話題,但一些遊戲標題是英語,英國英語和加拿大英語。 (我不知道爲什麼。)如何使用LANGMATCHES命令過濾普通英語? '過濾器(LANGMATCHES(LANG(...),「en」))'似乎不夠。謝謝。 – posfan12

+1

正確的說,'LANGMATCHES'函數對於語言的範圍是不可知的,也就是說它匹配英式英語和美式英語等。爲了避免這些重複,不要使用'LANGMATCHES',即'FILTER (LANG(?gL)=「en」)' – AKSW

相關問題