Rdf SPARQL strlen显示的xs:date值不正确 脚本

Rdf SPARQL strlen显示的xs:date值不正确 脚本,rdf,sparql,dbpedia,Rdf,Sparql,Dbpedia,我正在使用开源dbpedia浏览器来处理sparql查询。我试图解析dbo:birthDate的xs:date中的月和日值。它不是日期时间,所以我不能使用month()或dayOfWeek()函数。相反,我选择了substr,它在一个月内运行良好。但是,尝试使用值9,2的子字符串会导致无效的索引错误。所以我修改了sparql来显示字符串和strlen值,现在我完全搞糊涂了。它显示的字符串是有效的日期格式“yyyy-mm-dd”,为10个字符。然而,它显示的strlen为7 以下是查询: PREF

我正在使用开源dbpedia浏览器来处理sparql查询。我试图解析dbo:birthDate的xs:date中的月和日值。它不是日期时间,所以我不能使用month()或dayOfWeek()函数。相反,我选择了substr,它在一个月内运行良好。但是,尝试使用值9,2的子字符串会导致无效的索引错误。所以我修改了sparql来显示字符串和strlen值,现在我完全搞糊涂了。它显示的字符串是有效的日期格式“yyyy-mm-dd”,为10个字符。然而,它显示的strlen为7

以下是查询:

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name, ?bmonth, ?bstring, ?len1, ?len2
WHERE {
  ?person foaf:name ?name .
  ?person dbo:birthDate ?birth .
  BIND (str(?birth) AS ?bstring)
  BIND (strlen(?bstring) AS ?len1)
  BIND (substr(?bstring, 6,2) AS ?bmonth)
  BIND (strlen(?bstring) AS ?len2)
  FILTER ( ?bmonth = '12' )
} GROUP BY ?person ORDER BY ?len1 LIMIT 50
查询:

结论/问题 本质上,我只是想从字符串中获取dayOfMonth值。但如果有人也能向我解释它是如何推出7的,我将不胜感激

通过强制转换为xsd:dateTime来提取日和月 SPARQL 1.1有一个
day
函数,返回日期时间的日期

以整数形式返回arg的日部分

此函数对应于

您可以使用
xsd:dateTime
函数将
xsd:date
s转换为
dateTimes
,您可以对其应用此函数。例如:

prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?month ?day where {
  # Provide some values for ?date.  Note that 
  # we can use xsd:date *and* xsd:dateTime here,
  # as both can be cast to xsd:dateTime.
  values ?date { 
    "2011-01-02"^^xsd:date
    "2012-10-11"^^xsd:date
    "2013-12-30T14:45:13.815-05:00"^^xsd:dateTime 
  }

  # Cast to a xsd:dateTime and extract the day and month.
  bind( day(xsd:dateTime(?date)) as ?day )
  bind( month(xsd:dateTime(?date)) as ?month )
}
为什么DBpedia会做奇怪的事情 找出为什么会得到7的最简单方法是询问长度为7的值,看看得到了什么。例如,查看测试结果

SELECT ?person ?birth WHERE {
  ?person dbpedia-owl:birthDate ?birth .
  bind( strlen(str(?birth)) as ?blen )
  filter( ?blen < 10 )
}
LIMIT 25
您将获得一些特定于DBpedia的行为。例如,可能您正在按个人分组,然后选择正在执行隐式的
样本
,可能其中一些人的出生日期有多个值。(我对此不确定,这只是我想到的一种可能性。DBpedia目前正在进行维护,因此我无法检查那里有哪些数据,即使我可以检查,这是标准未定义的行为。我建议您首先检查您的查询并获得合法的SPARQL。只有这样,我们才能告诉您它是否返回了它所返回的数据。)ught to。)

通过强制转换为xsd:dateTime来提取日期和月份 SPARQL 1.1有一个
day
函数,返回日期时间的日期

以整数形式返回arg的日部分

此函数对应于

您可以使用
xsd:dateTime
函数将
xsd:date
s转换为
dateTimes
,您可以对其应用此函数。例如:

prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?month ?day where {
  # Provide some values for ?date.  Note that 
  # we can use xsd:date *and* xsd:dateTime here,
  # as both can be cast to xsd:dateTime.
  values ?date { 
    "2011-01-02"^^xsd:date
    "2012-10-11"^^xsd:date
    "2013-12-30T14:45:13.815-05:00"^^xsd:dateTime 
  }

  # Cast to a xsd:dateTime and extract the day and month.
  bind( day(xsd:dateTime(?date)) as ?day )
  bind( month(xsd:dateTime(?date)) as ?month )
}
为什么DBpedia会做奇怪的事情 找出为什么会得到7的最简单方法是询问长度为7的值,看看得到了什么。例如,查看测试结果

SELECT ?person ?birth WHERE {
  ?person dbpedia-owl:birthDate ?birth .
  bind( strlen(str(?birth)) as ?blen )
  filter( ?blen < 10 )
}
LIMIT 25

您将获得一些特定于DBpedia的行为。例如,可能您正在按个人分组,然后选择正在执行隐式的
样本
,可能其中一些人的出生日期有多个值。(我对此不确定,这只是我想到的一种可能性。DBpedia目前正在进行维护,因此我无法检查那里有哪些数据,即使我可以检查,这是标准未定义的行为。我建议您首先检查您的查询并获得合法的SPARQL。只有这样,我们才能告诉您它是否返回了它所返回的数据。)ught to。)

看起来DBPedia的SPARQL引擎甚至不需要cast to dateTime——它的月和日函数也可以处理xsd:date literals.O,这可能是一种标准转换;我不确定,但我会检查规范。如果是,那么这可能会更简单一些。据我所知,这不是标准的-表示xsd:date和xsd:dateTime都源自xsd:anySimpleType。此外,我还必须添加一个正则表达式过滤器,以防止DBPedia的引擎在day和month函数中被格式错误的文本阻塞。@Alex是的,但是day函数被描述为对应于
fn:day from dateTime($arg as xs:dateTime?)和xs:integer?
$arg as xs:dateTime
是否意味着存在自动(尝试)强制转换?我认为该规范不需要对数值类型以外的任何类型进行自动强制转换,但是允许实现在有意义的时候这样做。看起来DBPedia的SPARQL引擎甚至不需要转换为dateTime——它的月和日函数也可以处理xsd:date文本。O,这可能是一种标准转换;我不确定,但我会检查规范。如果是,那么这可能会更简单一些。据我所知,这不是标准的-表示xsd:date和xsd:dateTime都源自xsd:anySimpleType。此外,我还必须添加一个正则表达式过滤器,以防止DBPedia的引擎在day和month函数中被格式错误的文本阻塞。@Alex是的,但是day函数被描述为对应于
fn:day from dateTime($arg as xs:dateTime?)和xs:integer?
$arg as xs:dateTime
是否意味着存在自动(尝试)强制转换?我认为该规范不要求对数值类型以外的任何类型进行自动强制转换,但允许在有意义的情况下实现自动强制转换。这里的部分问题是使用GROUP BY,显然是为了消除每个人的重复解决方案。从技术上讲,这是一个无效的查询-如果您有一个GROUP BY,那么在SELECT中只能有一个分组变量或聚合表达式。如果查询实际运行,其结果是未定义的。这里的部分问题是您使用GROUP BY,显然是为了消除每个人的重复解决方案。从技术上讲,这是一个无效的查询-如果您有一个GROUP BY,那么在SELECT中只能有一个分组变量或聚合表达式。如果查询实际运行,则其结果未定义。
---------------
| month | day |
===============
| 01    | 02  |
| 10    | 11  |
| 12    | 30  |
---------------
SELECT ?person ?birth WHERE {
  ?person dbpedia-owl:birthDate ?birth .
  bind( strlen(str(?birth)) as ?blen )
  filter( ?blen < 10 )
}
LIMIT 25
Person                            Birth
-----------------------------------------------------------------------------------------
Alyson_No%C3%ABl                  "--12-03"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>
Corneille_(singer)                "--03-24"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>
Count_Karl_Sigmund_von_Hohenwart  "--02-12"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>
David_Lewis_(politician)          "--06-23"^^<http://www.w3.org/2001/XMLSchema#gMonthDay>
…                                 …
SELECT ?name, ?bmonth, ?bstring, ?len1, ?len2 WHERE {
  ?person foaf:name ?name .
  ?person dbo:birthDate ?birth .
  BIND (str(?birth) AS ?bstring)
  BIND (strlen(?bstring) AS ?len1)
  BIND (substr(?bstring, 6,2) AS ?bmonth)
  BIND (strlen(?bstring) AS ?len2)
  FILTER ( ?bmonth = '12' )
}
GROUP BY ?person
ORDER BY ?len1
LIMIT 50