如何使用SPARQL验证RDF文字?

问题描述 投票:1回答:1

我可以将以下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:datexsd:dateTimexsd:booleanxsd: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. 
validation sparql rdf literals virtuoso
1个回答
2
投票

如何处理错误和警告是所用工具的一个特征。正如评论中所指出的那样,"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”)是个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.