Каков эффект закрытия формы свойства?

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