Как соответствовать точным строковым литералам в SPARQL?

У меня есть этот запрос. Это соответствует чему-либо, что имеет "Юг" на его имя. Но я только хочу тот чей foaf:name является точно "Южным".

SELECT Distinct ?TypeLabel 
WHERE
{
    ?a     foaf:name   "South" .
    ?a     rdf:type    ?Type .
    ?Type  rdfs:label  ?TypeLabel .
}
6
задан iwillnot 14 November 2017 в 13:09
поделиться

2 ответа

(Прекращение комментариев по этому поводу)

Проблемы с данными

Проблема в данных, а не в вашем запросе. Если использовать следующий запрос:

SELECT DISTINCT ?a 
WHERE { 
    ?a foaf:name "Imran Khan" . 
}

Вы найдете (как вы говорите) «Имран Хан Ниази». Но посмотрев запись в dbpedia для Имрана Хана , вы увидите оба:

foaf:name "Imran Khan Niazy"
foaf:name "Imran Khan"

Это потому, что RDF допускает многократное использование свойств.

Причина

«Юг» имел ту же проблему (альбом, исполнитель и, как ни странно, «Южный Лутон»). Это случаи, когда есть как знакомые имена («Имран Хан», «Юг»), так и более точные имена («Имран Хан Ниази», «Юг (альбом)») в целях правильности или устранения неоднозначности.

Разрешение

Если вы хотите более точное совпадение, попробуйте добавить тип (например, http://dbpedia.org/ontology/MusicalWork для альбома).

Остерегайтесь

Имейте в виду, что DBpedia является производным от Википедии, и процесс извлечения не идеален. Это область с нестабильными данными, поэтому не думайте, что ваш запрос пошел не так.

4
ответ дан 9 December 2019 в 20:41
поделиться

Этот запрос должен точно соответствовать литералу South , а не литералам, просто содержащим South в качестве подстроки. Для частичных совпадений перейдите к ФИЛЬТР , например, REGEX () . В этом смысле ваша система запросов не работает - с какой системой запросов вы работаете?

3
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: