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