sparql - 按天和月过滤 SPARQL 结果

标签 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

我想找到一种过滤结果的方法,以便只有在这一天出生的人XY正在被选中(无论出生年份)。我一直在尝试使用许多方法来做到这一点,例如:

1) 基本过滤:FILTER(xsd:date(?value) = "2000-01-01"^^xsd:date)但是我现在不知道如何准确地说明我不在乎年份的事实......

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

3) 将日期转换为字符串变量。然后测试这个字符串变量(对应月和日)的结束字符是否与所需的月和日匹配。这将类似于:FILTER(STRENDS(CONVERT(CHAR, ?value),"01-01") = true)
显然,上面列出的方法都没有正常工作......哈哈。
请不要因为我的请求的糟糕语法而责怪我,因为我刚刚开始使用 SPARQL 命令。

我将非常感谢那里的任何帮助!!!

最佳答案

您会收到错误消息,因为(正如我在评论中所说)并非所有文字都属于或可以是 CAST到,输入 xsd:date . A 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 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

错误:
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 出了什么问题。

关于sparql - 按天和月过滤 SPARQL 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795902/

相关文章:

sparql - 如何在 SPARQL 中从 DBpedia 检索空白节点,并使用 DISTINCT 解释减少的结果

java - 如何从 DBPedia 获取类别层次结构?

Sparql 1.1 获取特定类的所有实例,但不包括子类的任何实例

sparql - 使用聚合子查询的错误查询评估

iphone - AFNetworking SPARQL查询失败,URL错误

xml - 如何使用 SWI-Prolog 从 OWL RDF/XML 查询个体的对象属性?

SPARQL 查询 : using VALUES inline data or UNION with bigdata store

regex - 在 sparql 中用正则表达式拆分逗号分隔的字符串

rdf - Turtle 中的 GML 字符串

javascript - 这是什么类型的编码?