Парсинг возвратов из AltLabel в запросе SPARQL
В запросе SPARQL Wikidata, таком как следующий, я хочу иметь возможность использовать собственный разделитель для возвращаемых значений для ?placeOfBirthAltLabel
,
Проблема в том, что некоторые значения под ?placeOfBirthAltLabel
запятые
например, синонимы для "Нью-Йорк" включают в себя "Нью-Йорк, США" в виде одной записи.
Однако, поскольку возвращаемые значения разделены запятыми, эта отдельная запись будет проанализирована как две отдельные строки.
Другими словами, мне нужно, чтобы возвращение было [Нью-Йорк, США; Нью-Йорк; Нью-Йорк, США], в отличие от [Нью-Йорк, США, Нью-Йорк, Нью-Йорк, США]
SELECT ?item ?itemLabel ?placeOfBirthLabel ?placeOfBirthAltLabel
WHERE
{
?item wdt:P106 wd:Q10833314.
OPTIONAL { ?item wdt:P19 ?placeOfBirth }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
LIMIT 100
Спасибо!
1 ответ
Вам не нужно разбирать альтернативные метки. Их значения объединяются службой меток. Только не используйте сервис меток для альтернативных меток:
SELECT ?item ?itemLabel ?placeLabel ?place_alt_label WHERE {
?item wdt:P106 wd:Q10833314.
OPTIONAL {
?item wdt:P19 ?place .
OPTIONAL {
?place skos:altLabel ?place_alt_label .
FILTER (lang(?place_alt_label)='en')
}
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
Если вы все еще хотите разобрать... Запятая жестко закодирована, используйте группирование и GROUP_CONCAT
с пользовательским разделителем вместо:
SELECT ?item ?itemLabel ?placeLabel
(GROUP_CONCAT(?place_alt_label; separator='; ') AS ?4) WHERE {
?item wdt:P106 wd:Q10833314.
OPTIONAL {
?item wdt:P19 ?place .
OPTIONAL {
?place skos:altLabel ?place_alt_label .
FILTER (lang(?place_alt_label)='en')
}
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
GROUP BY ?item ?itemLabel ?placeLabel
Будьте осторожны с переменными, спроектированными службой меток. Например,
SELECT ?item ?itemLabel ?placeLabel {...}
GROUP BY ?item ?itemLabel ?placeLabel
должно работать, тогда как
SELECT ?item ?itemLabel (SAMPLE(?placeLabel) AS ?3) {...}
GROUP BY ?item ?itemLabel
не должно.