Как убедиться, что ключи сопоставления ключ-значение уникальны в SHACL? - PullRequest
0 голосов
/ 27 мая 2019

Предположим, мои данные моделируют сопоставление ключ-значение, например, я управляю шикарным отелем и хочу отслеживать заказы моих гостей на каждый прием пищи.Как мне обеспечить, чтобы за каждый прием пищи я получал заказ каждого гостя (т.е. все ключи присутствуют), а на каждого гостя у меня был только один заказ (т.е. все ключи уникальны)?

Пример кода для начала работы:

Формы:

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?

1 Ответ

1 голос
/ 29 мая 2019

Если я правильно понимаю ваш конкретный сценарий, то это должно дать вам нарушение:

ex:MealShape
  sh:property [
      sh:path ( ex:orders ex:guest ) ;
      sh:maxCount 2 ;
      sh:minCount 2 ;
  ] ...

Механизм здесь заключается в том, что используется выражение пути (например: orders / ex: guest в SPARQL-нотации)указать, что на еду должно быть ровно два разных гостя, что также подразумевает, что каждый из них может быть только частью одного заказа.В сочетании с sh: in это гарантирует, что присутствуют только разрешенные ключи и все они.Однако вам необходимо выровнять длину списка sh: в списке со значениями sh: min / max, поэтому я не уверен, насколько это возможно.

Вероятно, вы можете еще больше обобщить этот шаблон с помощьюSHACL-SPARQL, например, для представления компонентов ограничений более высокого уровня, о которых вы говорите.

...