Как проверить литералы RDF с помощью SPARQL? - PullRequest
0 голосов
/ 21 февраля 2019

Я могу загрузить следующий файл черепахи в конечную точку 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 и подтипов:

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 голосов
/ 22 февраля 2019

Как обрабатываются ошибки и предупреждения, является особенностью используемых инструментов.Как отмечено в комментариях, "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") - хорошая идея.

...