Можно ли написать форму, которая проверяет область и диапазон данного свойства?

Я пытаюсь проверить мои экземпляры онтологии, используя формы SHACL. Однако я не могу найти, как сказать, что данный экземпляр свойства действителен, только если он имеет экземпляр Class1 в качестве субъекта и экземпляр Class2 в качестве объекта.

Другими словами, я хочу указать домен (т. Е. Class1) и диапазон (т. Е. Class2) этого свойства.

В следующем примере мы уточняем, что диапазон (клиент и лицо), но домен не указан.

ex:InvoiceShape
a sh:NodeShape ;
sh:property [
    sh:path ex:customer ;
    sh:class ex:Customer ;
    sh:class ex:Person ;
] .

Я знаю, что можно указать целевой класс (TC) для фигуры, но это ограничивает диапазон свойства ex:customer, когда доменом является TC, и не во всех случаях.

Можно ли написать форму, которая фиксирует область и диапазон данного свойства?

Спасибо!

1 ответ

Решение

Чтобы указать, что указанное выше ограничение свойства применяется ко всем экземплярам ex:Invoice, вы должны добавить ex: InvoiceShape rdf: type rdfs:Class или ex: InvoiceShape sh: targetClass ex: Invoice. Это, однако, не указывает, что все предметы тройки ex: customer должны быть экземплярами ex: Invoice.

Чтобы убедиться, что свойство ex: customer может использоваться только в экземплярах ex:Invoice, вы можете использовать:

ex:InverseInvoiceShape
    a sh:NodeShape ;
    sh:targetSubjectsOf ex:customer ;
    sh:class ex:Invoice .

Вышеприведенная форма относится ко всем предметам бывшей тройки клиентов. О нарушении будет сообщено, если этот объект не является экземпляром ex: Invoice.

В вашем первоначальном примере указано, что значения ex: customer должны быть экземплярами ex:Customer и ex: Person. Если вы хотели выразить "либо клиент, либо лицо", используйте

ex:InvoiceShape
    a sh:NodeShape ;
    sh:targetClass ex:Invoice ;
    sh:property [
        sh:path ex:customer ;
        sh:or (
            [ sh:class ex:Customer ]
            [ sh:class ex:Person ]
        )
    ] .
Другие вопросы по тегам