2017-05-28 2 views
0

J'ai ce code SPARQL qui est destiné à travailler sur Wikidata:Capitaliser la première lettre d'un jeu de résultats

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) 

Vous pouvez tester le code ici:

https://query.wikidata.org/

Supposons que ?genreLabel est toujours en minuscules par défaut. Comment puis-je mettre en majuscule la première lettre de chaque valeur renvoyée? Merci.

Répondre

1

C'est le point où les choses se compliquent avec l'étiquette magique SERVICE Wikidata parce que vous ne pouvez pas les utiliser dans des pièces de BIND - ou moins, je ne sais pas comment:

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) 

L'idée est que suit:

  • prendre le premier caractère de l'étiquette: SUBSTR(?gL, 1, 1)
  • appliquent l'opérateur de majuscules sur elle: UCASE(SUBSTR(?gL, 1, 1))
  • prendre toute la chaîne à partir du second caractère: SUBSTR(?gL, 2))
  • concaténer les deux parties: CONCAT(UCASE(SUBSTR(?gL, 1, 1)), SUBSTR(?gL, 2))

note, à un moment donné, il pourrait être plus facile de faire la modification chaîne et le style du côté client ...

+0

Ceci est légèrement hors-sujet, mais certains titres de jeux sont en anglais, en anglais britannique et en anglais canadien. (Je n'ai aucune idée pourquoi.) Comment filtrer juste pour l'anglais régulier en utilisant la commande LANGMATCHES? 'FILTER (LANGMATCHES (LANG (...)," en "))' ne semble pas suffisant. Merci. – posfan12

+1

À droite, les fonctions 'LANGMATCHES' sont utilisées pour être agnostique en ce qui concerne la portée d'une langue, c'est-à-dire anglais anglais, anglais américain, etc. Pour éviter ces doublons, n'utilisez pas' LANGMATCHES', ie 'FILTER (LANG (? GL) = "en") ' – AKSW