我可以将以下turtle文件上传到Virtuoso SPARQL端点,而不会收到错误或警告:
@base <> .
@prefix :<>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
# wrong
:x :y "kind of?"^^xsd:boolean.
:x :y "whenever"^^xsd:date.
:x :y "2000-01-01"^^xsd:dateTime.
:x :y "2000-01-01-06:00"^^xsd:date.
:x :y "01012000"^^xsd:date.
:x :y "x"^^xsd:integer.
:x :y "-1"^^xsd:nonNegativeInteger.
:x :y "0"^^xsd:positiveInteger.
# correct
:x :y "2000-01-01"^^xsd:date.
:x :y "2000-01-01-06:00"^^xsd:dateTime.
:x :y "true"^^xsd:boolean.
:x :y "false"^^xsd:boolean.
:x :y "-5"^^xsd:integer.
:x :y "0"^^xsd:nonNegativeInteger.
:x :y "1"^^xsd:positiveInteger.
上传时整数值转换为“0”,但日期和整数子类型将按指定上传。
是否有预定义的过程或其他标准化方法来检查我的文字是否符合SPARQL查询中的数据类型?
这就是我为xsd:date
,xsd:dateTime
,xsd:boolean
,xsd:integer
和subtypes提出的:
select *
{
?s ?p ?o.
filter(!isIRI(?o)).
bind(datatype(?o) as ?type)
filter
(
(?type=xsd:boolean&&xsd:boolean(?o)!=?o)
|| (?type=xsd:date&&xsd:date(?o)!=?o)
|| (?type=xsd:integer&&xsd:int(?o)!=?o)
|| ((?type=xsd:positiveInteger) && (xsd:int(?o)!=?o||xsd:int(?o)<1))
|| ((?type=xsd:nonNegativeInteger) && (xsd:int(?o)!=?o||xsd:int(?o)<0))
)
}
但是,它没有显示那些没有时间和日期的dateTimes的警告:
:x :y "2000-01-01"^^xsd:dateTime.
:x :y "2000-01-01-06:00"^^xsd:date.
如何处理错误和警告是所用工具的一个特征。正如评论中所指出的那样,"kind of?"^^xsd:boolean
是一个法律文字;符合数据类型是违法的。 RDF解析器可能不知道dataype。
该应用程序可以在发送之前验证数据。否则,服务器日志中可能会出现警告。
用于解析数据的在线服务(不要用于任何大的!)是
http://www.sparql.org/data-validator.html
它基于Apache Jena。
警告是(除了由于相对URI <>
的前缀):
[line: 6, col: 7 ] Lexical form 'kind of?' not valid for datatype XSD boolean
[line: 8, col: 7 ] Lexical form 'whenever' not valid for datatype XSD date
[line: 9, col: 7 ] Lexical form '2000-01-01' not valid for datatype XSD dateTime
[line: 12, col: 7 ] Lexical form '01012000' not valid for datatype XSD date
[line: 14, col: 7 ] Lexical form 'x' not valid for datatype XSD integer
[line: 15, col: 7 ] Lexical form '-1' not valid for datatype XSD nonNegativeInteger
[line: 16, col: 7 ] Lexical form '0' not valid for datatype XSD positiveInteger
[line: 21, col: 7 ] Lexical form '2000-01-01-06:00' not valid for datatype XSD dateTime
SPARQL测试
xsd:dateTime(str(?o)) = ?o
等等其他数据类型(注意额外的“str”)是个好主意。