Запрос SPARQL возвращает несколько дат рождения одного и того же человека

Я изучаю SPARQL и dbpedia, работая с запросами в https://www.joe0.com/2014/09/22/how-to-use-sparql-to-query-dbpedia-and-freebase/. Я тестирую запрос на получение даты рождения Джона Леннона и выполняю свои запросы в http://dbpedia.org/sparql. Запрос:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?x0 ?x1 WHERE {
?x0 rdf:type foaf:Person.
?x0 rdfs:label "John Lennon"@en.
?x0 dbpedia-owl:birthDate ?x1.
}

Он возвращает две строки, содержащие одну и ту же дату (9 октября 1940 г.). Мой вопрос: почему запрос возвращает две строки, даже если он использует DISTINCT? Прежде чем задать этот вопрос, я проверил следующее:

но я не думаю, что они объясняют повторяющиеся даты.

Редактировать: Я преобразовал результаты в текст и вставил их ниже

-------------------------------------- -----------------------------------------------------
x0                                      x1
--------------------------------------- -----------------------------------------------------
http://dbpedia.org/resource/John_Lennon 1940-10-09 
http://dbpedia.org/resource/John_Lennon "1940-10-9"^^<http://www.w3.org/2001/XMLSchema#date>

Нет, они такие же. Я постараюсь скопировать / вставить результаты.

Ubercoder 27.04.2018 12:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
746
4

Ответы 4

Я выполнил ваш запрос на конечной точке DBpedia и запросил результаты в формате на основе RDF (Turtle) и обнаружил, что лексические формы литералов даты на самом деле отличаются:

"1940-10-09"^^xsd:date
"1940-10-9"^^xsd:date

Второй на самом деле не является легальным xsd:date. Во-первых, вероятно, поэтому конечная точка SPARQL печатает это «красивым» способом в таблице HTML (как только 1940-10-09).

Но я не понимаю, почему должно быть два литерала даты - в этот день должен быть только один Джон Леннон. Повторяя результаты в форме RDF, я не думаю, что конечная точка dbpedia, на которую я ссылался, может это сделать.

Ubercoder 27.04.2018 12:38

Моя ошибка, я все еще здесь учусь. Как вы сделали так, чтобы конечная точка отображала RDF?

Ubercoder 27.04.2018 12:42

Также я только что отредактировал свой вопрос и добавил результаты запроса.

Ubercoder 27.04.2018 12:42

Приношу свои извинения по поводу RDF, я изменил раскрывающийся список на RDF, как вы сказали, и это позволяет мне загрузить полученный файл RDF.

Ubercoder 27.04.2018 12:49

Одна цифра @JoshuaTaylor в xsd: дата недопустима. live.dbpedia.org/page/John_Lennon и живая попытка mappings.dbpedia.org/server/extraction/en/… не имеют его дефекта. Так что это была ошибка в экстракторе, используемом для этой версии DBpedia.

Vladimir Alexiev 27.04.2018 14:32

Известная проблема в DBpedia ... Я работал над этим целую вечность и всегда очищал данные, прежде чем загружать дамп DBpedia в локальное тройное хранилище. Специально для литералов xsd:datee существуют десятки вариаций w.r.t. недопустимый синтаксис.

UninformedUser 28.04.2018 10:31

Что ж, это не твоя вина! Просто у ресурса есть обе эти тройки, как вы можете видеть здесь. В данных есть дубликаты.

Могу ли я добавить фильтр или условие к дате в? X1, чтобы он возвращал только действительные даты? В SQL есть функция ISDATE, но я не знаю достаточно SPARQL, чтобы сделать то же самое. PS: Я понимаю, что SQL и SPARQL - это совершенно разные вещи.

Ubercoder 27.04.2018 15:41

Как уже говорилось, похоже, что у dbpedia две даты: 1940-10-09 (действительна) и 1940-10-9 (недействительна). Ответ - добавить ФИЛЬТР, который преобразует дату в строку и допускает только даты, соответствующие ГГГГ-ММ-ДД. В любом случае это работает!

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?x0 ?x1 STR(?x1) WHERE {
?x0 rdf:type foaf:Person.
?x0 rdfs:label "John Lennon"@en.
?x0 dbpedia-owl:birthDate ?x1.
FILTER (REGEX(STR(?x1),"[0-9]{4}-[0-9]{2}-[0-9]{2}")).
} 

Результатом является замедление запросов, потому что каждый доступ к недопустимой дате вызывает исключение (например, с запросом от fuseki) или фильтр выполняет работу по устранению неправильной даты, но это дорого.

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