Я изучаю 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>





Я выполнил ваш запрос на конечной точке DBpedia и запросил результаты в формате на основе RDF (Turtle) и обнаружил, что лексические формы литералов даты на самом деле отличаются:
"1940-10-09"^^xsd:date
"1940-10-9"^^xsd:date
Второй на самом деле не является легальным xsd:date. Во-первых, вероятно, поэтому конечная точка SPARQL печатает это «красивым» способом в таблице HTML (как только 1940-10-09).
Но я не понимаю, почему должно быть два литерала даты - в этот день должен быть только один Джон Леннон. Повторяя результаты в форме RDF, я не думаю, что конечная точка dbpedia, на которую я ссылался, может это сделать.
Моя ошибка, я все еще здесь учусь. Как вы сделали так, чтобы конечная точка отображала RDF?
Также я только что отредактировал свой вопрос и добавил результаты запроса.
Приношу свои извинения по поводу RDF, я изменил раскрывающийся список на RDF, как вы сказали, и это позволяет мне загрузить полученный файл RDF.
Одна цифра @JoshuaTaylor в xsd: дата недопустима. live.dbpedia.org/page/John_Lennon и живая попытка mappings.dbpedia.org/server/extraction/en/… не имеют его дефекта. Так что это была ошибка в экстракторе, используемом для этой версии DBpedia.
Известная проблема в DBpedia ... Я работал над этим целую вечность и всегда очищал данные, прежде чем загружать дамп DBpedia в локальное тройное хранилище. Специально для литералов xsd:datee существуют десятки вариаций w.r.t. недопустимый синтаксис.
Что ж, это не твоя вина! Просто у ресурса есть обе эти тройки, как вы можете видеть здесь. В данных есть дубликаты.
Могу ли я добавить фильтр или условие к дате в? X1, чтобы он возвращал только действительные даты? В SQL есть функция ISDATE, но я не знаю достаточно SPARQL, чтобы сделать то же самое. PS: Я понимаю, что SQL и SPARQL - это совершенно разные вещи.
Как уже говорилось, похоже, что у 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) или фильтр выполняет работу по устранению неправильной даты, но это дорого.
Нет, они такие же. Я постараюсь скопировать / вставить результаты.