按天和月过滤SPARQL结果

时间:2016-09-30 16:18:41

标签: sparql rdf dbpedia

我目前正在使用http://dbpedia.org/snorql网站发布一些基本请求,如下所示:

PREFIX dbpedia0: <http://dbpedia.org/ontology/>
SELECT ?body ?value WHERE {
?body a dbpedia0:Person.
?body dbpedia0:birthDate ?value.
}
ORDER BY ?value

我想找到一种过滤结果的方法,以便只选择在X个月Y出生的人(无论出生年份)。我一直试图通过许多方法这样做:

1)基本过滤:FILTER(xsd:date(?value) = "2000-01-01"^^xsd:date) 但我现在不知道如何确定我不关心这一年的事实......

2)使用应导致表示月和日的整数值的MONTH()DAY()函数...但这些似乎不起作用,因为我的日期类型被认为是无效的输入参数。

3)将日期转换为字符串变量。然后测试此字符串变量的结尾字符(对应于月份和日期)是否与所需的月份和日期匹配。这可能是:FILTER(STRENDS(CONVERT(CHAR, ?value),"01-01") = true)

显然,上面列出的方法都没有正常工作......哈哈。 请不要责怪我的请求语法不好,因为我刚开始使用SPARQL命令。

我非常感谢来自那里或其他地方的任何帮助!!!

1 个答案:

答案 0 :(得分:2)

您收到错误,因为(正如我在评论中所述)并非所有文字都属于CAST,而是xsd:date。可以使用filter

PREFIX dbpedia0: <http://dbpedia.org/ontology/>
SELECT ?body ?value WHERE 
  { 
    ?body  a                   dbpedia0:Person  . 
    ?body  dbpedia0:birthDate  ?value           . 
           FILTER (   datatype(?value) = xsd:date
                   &&     year(?value) = 2000
                  )
  } 
limit 10

错误:

Virtuoso 22003 Error SR586: Incomplete RDF box as argument 0 for year().

使用cast进行的另一次尝试让我觉得FILTER参数以任意顺序执行,并导致另一个错误:

PREFIX dbpedia0: <http://dbpedia.org/ontology/>
SELECT ?body ?value 
WHERE 
  { 
    ?body  a                   dbpedia0:Person  . 
    ?body  dbpedia0:birthDate  ?value           . 
           FILTER (         datatype(?value) = xsd:date 
                   && year(xsd:date(?value)) = 2000
                  )
  } 
limit 10

错误:

Virtuoso 22007 Error DT001: Function year needs a datetime, date or time as argument 1, not an arg of type DB_NULL (204)

使用子SELECT似乎可行,但不适用于

PREFIX dbpedia0: <http://dbpedia.org/ontology/>

SELECT ?body ?value 
WHERE 
  { 
           FILTER ( year(xsd:date(?value)) = 2000 )
    { 
      SELECT ?body ?value 
      WHERE 
        { 
          ?body  a                   dbpedia0:Person  . 
          ?body  dbpedia0:birthDate  ?value           . 
                 FILTER ( datatype(?value) = xsd:date )
        }
    }
  }
limit 10

错误:

Virtuoso 22003 Error SR586: Incomplete RDF box as argument 1 for xqf_str_parse().

只有子LIMIT内的SELECT才适合我:

PREFIX dbpedia0: <http://dbpedia.org/ontology/>

SELECT ?body ?value 
WHERE 
  { 
           FILTER ( year(xsd:date(?value)) = 2000 )
      {
        SELECT ?body ?value 
        WHERE 
          { 
            ?body  a                   dbpedia0:Person  . 
            ?body  dbpedia0:birthDate  ?value           . 
                   FILTER ( datatype(?value) = xsd:date )
          }
        LIMIT 10
      }
   }
LIMIT 10

我不知道Virtuoso在这里出了什么问题。