如何使用SPARQL验证RDF文字?

时间:2019-02-21 12:40:02

标签: validation sparql rdf literals virtuoso

我可以将以下乌龟文件上传到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和子类型想到的:

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. 

1 个答案:

答案 0 :(得分:2)

如何处理错误和警告是所使用工具的功能。如评论中所述,"kind of?"^^xsd:boolean是合法文字。根据数据类型,它是非法的。 RDF解析器可能不了解数据类型。

该应用可以在发送数据之前对其进行验证。否则,服务器日志中可能会出现警告。

用于解析数据的在线服务(不要用于任何大事!)

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”)是个好主意。