11

我需要从 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 中的数据存在一些错误,引擎无法将字符串数据转换为日期类型,以便与我设置的日期进行比较。引擎会中断查询执行。

所以,问题是:有没有办法告诉引擎跳过所有错误的数据并将所有可以处理的数据返回给我?

4

3 回答 3

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

此查询在 DbPedia Live Endpoint 上提供以下SPARQL 结果

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

于 2013-10-03T21:19:56.373 回答
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 结果

于 2013-05-22T19:19:26.287 回答
0

在我看来,丢弃一个日期相差一天的结果似乎很愚蠢(就像 Windows 在感觉有问题时进行错误检查,例如您的 GPU 视频适配器连续挂起 5 次)。

既然您只关心年份,那么按字符串进行比较不是更好吗?

str(?released) >= "2000"

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

于 2015-01-08T10:00:12.017 回答