Парсинг возвратов из 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

не должно.

Другие вопросы по тегам