Предположим, мои данные моделируют сопоставление ключ-значение, например, я управляю шикарным отелем и хочу отслеживать заказы моих гостей на каждый прием пищи.Как мне обеспечить, чтобы за каждый прием пищи я получал заказ каждого гостя (т.е. все ключи присутствуют), а на каждого гостя у меня был только один заказ (т.е. все ключи уникальны)?
Пример кода для начала работы:
Формы:
ex:MealShape
a sh:NodeShape ;
sh:targetClass ex:Meal ;
sh:property [
sh:path ex:orders ;
sh:minCount 2 ;
sh:maxCount 2 ;
sh:node ex:OrderShape ;
] .
ex:OrderShape
a sh:NodeShape ;
sh:targetClass ex:Order ;
sh:property [
sh:path ex:guest ;
# The guest list! Code maintenance should happen here.
sh:in ( "James" "Margaret" ) ;
sh:minCount 1 ;
sh:maxCount 1 ;
] ;
sh:property [
sh:path ex:order ;
sh:datatype xsd:string ;
sh:minCount 1 ;
sh:maxCount 1 ;
] .
Данные:
## Guests
ex:james ex:name "James" .
ex:margaret ex:name "Margaret" .
## Meals
### Valid meal
ex:breakfast
a ex:Meal ;
ex:orders [ ex:guest "James" ; ex:order "Eggs" ] ;
ex:orders [ ex:guest "Margaret" ; ex:order "Cereal" ] .
### DESIRED TO BE invalid meal
### currently does not cause a validation result
ex:lunch
a ex:Meal ;
ex:orders [ ex:guest "James" ; ex:order "Salad" ] ;
# Problem: James placed two orders, Maggie placed zero
ex:orders [ ex:guest "James" ; ex:order "Burger" ] .
Одно из известных мне решений заключается в использовании qualShapeи его ограничения minCount и maxCount отдельно для каждого ключа в списке.Однако для больших «гостевых списков» это становится трудно поддерживать.В моей работе у меня есть список из примерно 40 ключей.С 40 блоками операторов qualShape становится непрактичным проверять список (и я уже написал сценарий генерации этих операторов).
Я искал документацию, но не смог найти что-то вроде "Требуемый оператор sh: disjointInScope "или" sh: uniqueFromList "(важно, что ограничение не должно заставлять значение быть уникальным во всем графе данных, поскольку, например, Джеймс может появляться в нескольких порядках).Как получить желаемое поведение в читаемом человеком коде SHACL?