我目前正在使用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命令。
我非常感谢来自那里或其他地方的任何帮助!!!
答案 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在这里出了什么问题。