Как пропустить неверные даты в запросе DBpedia SPARQL? - PullRequest
11 голосов
/ 28 сентября 2011

Мне нужно получить данные о фильмах из DBpedia.

Я использую запрос SPARQL следующим образом на http://dbpedia -live.openlinksw.com / sparql :

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?subject ?label ?released WHERE {
  ?subject rdf:type <http://dbpedia.org/ontology/Film>.
  ?subject rdfs:label ?label.
  ?subject <http://dbpedia.org/ontology/releaseDate> ?released.
  FILTER(xsd:date(?released) >= "2000-01-01"^^xsd:date).
} ORDER BY ?released
LIMIT 20

Я пытался получить фильмы, выпущенные после 01.01.2000.Но механизм отвечает следующим образом:

Virtuoso 22007 Error DT006: Cannot convert 2009-06-31 to datetime : 
Too many days (31, the month has only 30)

SPARQL query:
define sql:big-data-const 0 
#output-format:text/html
define sql:signal-void-variables 1 define input:default-graph-uri <http://dbpedia.org> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?subject ?label ?released WHERE {
  ?subject rdf:type <http://dbpedia.org/ontology/Film>.
  ?subject rdfs:label ?label.
  ?subject <http://dbpedia.org/ontology/releaseDate> ?released.
  FILTER(xsd:date(?released) >= "2000-01-01"^^xsd:date).
} ORDER BY ?released
LIMIT 20

Насколько я понимаю, в данных DBpedia есть некоторые ошибки, и механизм не может преобразовать строковые данные в тип даты, чтобы сравнить с установленной датой.И движок прерывает выполнение запроса.

Итак, вопрос: есть ли способ заставить движок пропустить все ошибочные данные и вернуть мне все, что могло быть обработано?

Ответы [ 3 ]

3 голосов
/ 04 октября 2013

Вы можете использовать функцию COALESCE для определения даты по умолчанию для недействительных:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?subject ?label ?released ?released_fixed WHERE {
  ?subject rdf:type <http://dbpedia.org/ontology/Film>.
  ?subject rdfs:label ?label.
  ?subject <http://dbpedia.org/ontology/releaseDate> ?released.
  bind ( coalesce(xsd:datetime(?released), '1000-01-01') as ?released_fixed)
  FILTER(xsd:date(coalesce(xsd:datetime(?released), '1000-01-01')) >= "2000-01-01"^^xsd:date).
} ORDER BY ?released
LIMIT 20

Этот запрос предоставляет следующие результаты SPARQL для конечной точки DbPedia Live

Конструкция связывания предназначена только для представления фиксированных дат, которые установлены на «1000-01-01» и хранятся в переменной ? Release_fixed . Привязка не требуется для запроса и может быть опущена вместе с ? Release_fixed в предложении SELECT

1 голос
/ 22 мая 2013

Одним из способов является фильтрация с использованием типа данных, как показано ниже:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?subject ?label ?released WHERE {
  ?subject rdf:type <http://dbpedia.org/ontology/Film>.
  ?subject rdfs:label ?label.
  ?subject <http://dbpedia.org/ontology/releaseDate> ?released.
  FILTER(datatype(?released) = <http://www.w3.org/2001/XMLSchema#dateTime>)
  FILTER(xsd:date(?released) >= "2000-01-01"^^xsd:date).
} ORDER BY ?released
LIMIT 20

SPARQL результаты

0 голосов
/ 08 января 2015

Отбрасывать результат с датой, которая выключена на один день, мне кажется глупым (например, Windows выполняет проверку ошибок, когда чувствует, что что-то не так, например, ваш видеоадаптер GPU зависает 5 раз подряд).

Поскольку вас заботит только год, не лучше ли сравнивать по строкам?

str(?released) >= "2000"

XSD говорит "по крайней мере 4 цифры в год", так что это работает для всех положительных лет (AD). Кстати, это также будет работать, если среда извлечения DBpedia найдет только год в этом поле.

...