按天和月筛选SPARQL结果

按天和月筛选SPARQL结果,sparql,rdf,dbpedia,Sparql,Rdf,Dbpedia,我目前正在使用该网站启动一些基本请求,如下所示: PREFIX dbpedia0: <http://dbpedia.org/ontology/> SELECT ?body ?value WHERE { ?body a dbpedia0:Person. ?body dbpedia0:birthDate ?value. } ORDER BY ?value 前缀dbpedia0: 选择“主体”值,其中{ ?主体a:0:人。 ?body dbpedia0:生日?值。 } 按价值排序 我想

我目前正在使用该网站启动一些基本请求,如下所示:

PREFIX dbpedia0: <http://dbpedia.org/ontology/>
SELECT ?body ?value WHERE {
?body a dbpedia0:Person.
?body dbpedia0:birthDate ?value.
}
ORDER BY ?value
前缀dbpedia0:
选择“主体”值,其中{
?主体a:0:人。
?body dbpedia0:生日?值。
}
按价值排序
我想找到一种过滤结果的方法,以便只选择在日期
X
month
Y
出生的人(无论出生年份如何)。我一直在尝试采用以下多种方法:

1) 基本筛选:
筛选(xsd:date(?value)=“2000-01-01”^^xsd:date)
但我现在不知道该如何准确地说出我不在乎这一年的事实

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

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

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

我将非常感谢任何帮助从上或其他在那里

您会得到一个错误,因为(正如我在评论中所说)并非所有的文本都是或可以是
CAST
to,type
xsd:date
。一个
过滤器可以工作

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
另一次尝试使用
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
使用sub-
SELECT
s似乎有效,但不适用于

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
只有在子菜单中有一个
限制
,选择它对我有效:

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
前缀dbpedia0:
选择“主体”值
哪里
{ 
过滤器(年份(xsd:date(?value))=2000)
{
选择“主体”值
哪里
{ 
?主体a:0:人。
?body dbpedia0:生日?值。
过滤器(数据类型(?值)=xsd:date)
}
限制10
}
}
限制10

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

为什么要添加标签MYSQL和SQL?为什么您要谈论“我才刚开始使用SQL”命令?SPARQL!=SQLAnd格式化问题也会有帮助,请注意DBpedia数据是非常异构的,尤其是日期文本是xsd:date、xsd:dateTime、xsd:gYear等。这使得从SPARQL规范强制转换和筛选非常困难,函数
year()
需要一个dateTime参数:
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().
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