如何在DBpedia SPARQL请求中跳过错误日期?

时间:2011-09-28 10:57:23

标签: sparql dbpedia virtuoso

我需要从DBpedia获取有关电影的数据。

我在http://dbpedia-live.openlinksw.com/sparql上使用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

我试图拍摄2000年1月1日之后发行的电影。 但引擎回答如下:

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 个答案:

答案 0 :(得分:3)

您可以使用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 Results on DbPedia Live Endpoint

绑定构造仅用于显示固定日期,这些日期设置为“1000-01-01”并存储在变量?release_fixed 中。查询不需要绑定,可以与SELECT子句中的?release_fixed 一起省略

答案 1 :(得分:1)

一种方法是使用数据类型进行过滤,如下所示:

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 results

答案 2 :(得分:0)

丢弃一天结束日期的结果对我来说似乎很愚蠢(就像Windows在发生错误时做错误检查,例如你的GPU视频适配器连续挂5次)。

既然你只关心这一年,那么比较字符串是不是更好?

str(?released) >= "2000"

XSD表示“年度至少4位数”,因此适用于所有正年(AD)。 顺便说一句,如果DBpedia提取框架在该领域仅发现一年,这也将有效。