Можно ли написать форму, которая проверяет область и диапазон данного свойства?
Я пытаюсь проверить мои экземпляры онтологии, используя формы 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 ]
)
] .