是否可以编写一个形状来验证给定属性的域和范围?

时间:2019-04-30 16:42:42

标签: properties shacl

我尝试使用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属性的范围。

是否可以编写固定给定属性的域和范围的形状?

谢谢!

1 个答案:

答案 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 ]
        )
    ] .