Запрос SPARQL возвращает несколько дат рождения одного и того же человека - PullRequest
0 голосов
/ 27 апреля 2018

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

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

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

0 голосов
/ 27 апреля 2018

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

0 голосов
/ 27 апреля 2018

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

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}")).
} 
0 голосов
/ 27 апреля 2018

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

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

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

...