Прописать первую букву набора результатов
У меня есть этот код SPARQL, который предназначен для работы на Wikidata:
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)
Вы можете проверить код здесь:
Предположим, что ?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))
Обратите внимание, что в какой-то момент может быть проще выполнить модификацию и стиль String на стороне клиента...