【问题标题】:Filtering SPARQL results by day and month按天和月过滤 SPARQL 结果
【发布时间】:2017-02-09 06:58:28
【问题描述】:

我目前正在使用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 命令。

我将非常感谢那里或其他人的任何帮助!!!

【问题讨论】:

  • 为什么要加标签MYSQL和SQL?你为什么要谈论“我只是从 SQL 开始”命令? SPARQL != SQL
  • 格式化问题也会有所帮助,请关注stackoverflow.com/help/formatting
  • DBpedia 数据非常异构,尤其是日期文字是 xsd:date、xsd:dateTime、xsd:gYear 等,这使得转换和过滤非常困难
  • 根据 SPARQL 规范,函数 year() 需要一个 dateTime 参数:w3.org/TR/sparql11-query/#func-year

标签: sparql rdf dbpedia


【解决方案1】:

您收到错误是因为(正如我在评论中所说)并非所有文字都属于或可以是 CAST 到类型 xsd:datefilter 可以工作

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().

casting 的另一次尝试让我觉得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)

使用 sub-SELECTs 似乎有效,但不适用于

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().

只有在子SELECT 内有一个LIMIT 才对我有用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2023-03-29
    • 2014-11-05
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多