Properties 是否可以编写一个形状来验证给定属性的域和范围?
我尝试使用SHACL形状验证我的本体实例。然而,我不知道如何说一个给定的属性实例只有在它有一个Class1实例作为主题,一个Class2实例作为对象时才有效 换句话说,我想指定这个属性的域(即Class1)和范围(即Class2) 在下面的示例中,我们确定范围为(客户和个人),但未指定域Properties 是否可以编写一个形状来验证给定属性的域和范围?,properties,shacl,Properties,Shacl,我尝试使用SHACL形状验证我的本体实例。然而,我不知道如何说一个给定的属性实例只有在它有一个Class1实例作为主题,一个Class2实例作为对象时才有效 换句话说,我想指定这个属性的域(即Class1)和范围(即Class2) 在下面的示例中,我们确定范围为(客户和个人),但未指定域 ex:InvoiceShape a sh:NodeShape ; sh:property [ sh:path ex:customer ; sh:class ex:Customer ; s
ex:InvoiceShape
a sh:NodeShape ;
sh:property [
sh:path ex:customer ;
sh:class ex:Customer ;
sh:class ex:Person ;
] .
我知道可以为形状指定目标类(TC),但当域为TC时,这限制了属性ex:customer的范围,而不是在所有情况下
是否可以编写一个形状来固定给定属性的域和范围
谢谢大家! 要声明上述属性约束适用于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:customer三元组的所有主题。如果该主题不是ex:Invoice实例,则将报告违规行为
FWIW您的原始示例声明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 ]
)
] .