Анализ возвращает AltLabel в запросе SPARQL.

В запросе Wikidata SPARQL, таком как следующий, я хочу иметь возможность использовать настраиваемый разделитель для результатов для ?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

Спасибо!


person fjhj2    schedule 25.07.2018    source источник
comment
если вы явно запрашиваете skos:altLabel, вы можете определить разделитель при использовании group by ?item ?placeOfBirth + group_concat   -  person UninformedUser    schedule 25.07.2018
comment
Запятая жестко запрограммировано, используйте GROUP_CONCAT, как указал AKSW.   -  person Stanislav Kralin    schedule 25.07.2018
comment
Спасибо обоим. Вы имеете в виду такой запрос: SELECT ?item ?itemLabel (GROUP_CONCAT(?placeOfBirthAltLabel; разделитель = ; ) AS ?placeOfBirthAlt) WHERE { ?item wdt:P106 wd:Q10833314. НЕОБЯЗАТЕЛЬНО { ?item wdt:P19 ?placeOfBirth . } SERVICE wikibase:label { bd:serviceParam wikibase:language en. ?item rdfs:метка ?itemLabel . ?placeOfBirth skos:altLabel ?placeOfBirthAltLabel . } } СГРУППИРОВАТЬ ПО ?item ?itemLabel LIMIT 500   -  person fjhj2    schedule 25.07.2018
comment
К сожалению, также не удалось понять, как разобрать его с помощью group_concat. Извиняюсь немного новичок в этом...   -  person fjhj2    schedule 25.07.2018


Ответы (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

не должен.

person Stanislav Kralin    schedule 25.07.2018
comment
Меня всегда удивляло, как медленно выполняются некоторые запросы, ведь в теннисе всего 8778 игроков... - person UninformedUser; 26.07.2018
comment
Это должно быть быстрее без OPTIONALs, без службы меток и с некоторыми подсказками... - person Stanislav Kralin; 26.07.2018