#rdf #shacl
#rdf #шакл
Вопрос:
В спецификации SHACL, насколько я вижу, ничто не запрещает закрывать форму свойства.
Ниже приведен пример по умолчанию из игровой площадки SHACL, с исправленными ошибками по умолчанию, поэтому данные действительны.
Формы:
@prefix dash: <http://datashapes.org/dash#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
schema:PersonShape
a sh:NodeShape ;
sh:targetClass schema:Person ;
sh:property [
sh:path schema:givenName ;
sh:datatype xsd:string ;
sh:name "given name" ;
] ;
sh:property [
sh:path schema:birthDate ;
sh:lessThan schema:deathDate ;
sh:maxCount 1 ;
] ;
sh:property [
sh:path schema:gender ;
sh:in ( "female" "male" ) ;
] ;
sh:property [
sh:path schema:address ;
sh:node schema:AddressShape ;
] .
schema:AddressShape
a sh:NodeShape ;
sh:closed true ;
sh:property [
sh:path schema:streetAddress ;
sh:datatype xsd:string ;
] ;
sh:property [
sh:path schema:postalCode ;
sh:or ( [ sh:datatype xsd:string ] [ sh:datatype xsd:integer ] ) ;
sh:minInclusive 10000 ;
sh:maxInclusive 99999 ;
] .
Данные (действительны — результатов проверки нет):
@prefix ex: <http://example.org/ns#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:Bob
a schema:Person ;
schema:givenName "Robert" ;
schema:familyName "Junior" ;
schema:birthDate "1971-07-07"^^xsd:date ;
schema:deathDate "2068-09-10"^^xsd:date ;
schema:address ex:BobsAddress .
ex:BobsAddress
schema:streetAddress "1600 Amphitheatre Pkway" ;
schema:postalCode 19404
Теперь, когда вы закрываете форму sh:path schema:address
свойства schema:PersonShape
, например, так:
sh:property [
sh:closed true ;
sh:path schema:address ;
sh:node schema:AddressShape ;
] .
С этим изменением есть результаты проверки:
[
a sh:ValidationResult ;
sh:resultSeverity sh:Violation ;
sh:sourceConstraintComponent sh:ClosedConstraintComponent ;
sh:sourceShape _:n1121 ;
sh:focusNode <http://example.org/ns#Bob> ;
sh:resultPath schema:streetAddress ;
sh:value "1600 Amphitheatre Pkway" ;
sh:resultMessage "Predicate is not allowed (closed shape)" ;
] .
[
a sh:ValidationResult ;
sh:resultSeverity sh:Violation ;
sh:sourceConstraintComponent sh:ClosedConstraintComponent ;
sh:sourceShape _:n1121 ;
sh:focusNode <http://example.org/ns#Bob> ;
sh:resultPath schema:postalCode ;
sh:value 19404 ;
sh:resultMessage "Predicate is not allowed (closed shape)" ;
] .
Спецификация sh:closed гласит:
[…] свойство с именем sh:closed, которое можно использовать для указания условия, при котором каждый узел значений имеет значения только для тех свойств, которые были явно перечислены через свойство shapes, указанное для фигуры через sh:property .
Мне очень жаль: я не могу найти объяснения тому, что происходит, а также тому, что должно произойти (если это не одно и то же).
Может кто-нибудь объяснить наблюдаемое / указанное поведение?
Спасибо!
Комментарии:
1. Возможно, я был неясен в вопросе: я знаю, что
sh:closed
это предназначено дляsh:NodeShape
s, и, экспериментируя с некоторыми формами, я обнаружил, что наsh:PropertyShape
s он ведет себя неожиданно. Мое мнение таково: целевой узел для узла shape (ex:Bob
) также является узлом значения для ClosedConstraintComponent в свойстве shape (= ‘shape’, упомянутом в спецификации). В спецификации говорится: «значения только для тех свойств, которые явно перечислены […] для формы», — но свойство shape не имеетsh:property
троек, и поэтому это нарушение. Это все?2. Можно рассмотреть случай
sh:in
, который не предназначен для использования с формами узлов, но также разрешен и работает так, как я ожидал (узлами фокуса может быть только одно из перечисленных значений). Это позволяет вам указать тип перечисления, который я нахожу полезным.