我尝试使用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),但这会在域为TC而不是在所有情况下都限制ex:customer属性的范围。
是否可以编写固定给定属性的域和范围的形状?
谢谢!
答案 0 :(得分:0)
要声明上述属性约束适用于ex:Invoice的所有实例,请添加ex:InvoiceShape rdf:type rdfs:Class或ex:InvoiceShape sh:targetClass ex:Invoice。但是,这并未指定ex:customer三元组的所有主题都必须是ex:Invoice的实例。
要确保在ex:Invoice实例中只能使用属性ex:customer ,可以使用:
ex:InverseInvoiceShape
a sh:NodeShape ;
sh:targetSubjectsOf ex:customer ;
sh:class ex:Invoice .
以上形状适用于ex:customer三元组的所有主题。如果该主题不是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 ]
)
] .