2016-09-30 53 views
2

我目前使用的http://dbpedia.org/snorql网站推出类似下面的一些基本要求:过滤SPARQL结果由日,月

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

我想找个过滤结果的方式这样才有人出生日期XY正在选择(无论出生年份)。我一直在尝试了许多方法,如这样做:

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

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

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

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

我会非常感谢任何帮助或其他在那里!

+0

为什么添加标签MYSQL和SQL?你为什么在谈论“我刚刚开始使用SQL”命令? SPARQL!= SQL – AKSW

+0

并且格式化问题也有帮助,请按照http://stackoverflow.com/help/formatting – AKSW

+0

DBpedia数据是非常不同的,尤其是日期文字是xsd:date,xsd:dateTime,xsd:gYear,等等这使得它非常难以投射和过滤 – AKSW

回答

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 ING导致我的印象是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(). 
LIMITSELECT

只有它为我工作:

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在这里出了什么问题。