在 SHACL 中建模 "inverse cardinality" 的简单方法?

Simple way to model "inverse cardinality" in SHACL?

我们想要将带有基数的 ontology 的 UML 图转换为 SHACL 形状,以验证我们数据中的基数是否正确。

假设我们有作者 1 ---第一作者 ---> 1.n 本书,右边的部分很容易建模为:

:AuthorShape a sh:NodeShape;
    sh:targetClass :Author;
    sh:property [sh:path :firstAuthor; sh:minCount 1].

但是现在我还想为“另一端”建模,即一本书不能有超过 1 个第一作者:

:FirstAuthorCardinalityOtherEndShape a sh:NodeShape;
    sh:targetObjectsOf :firstAuthor;
    sh:property [
            sh:path [ sh:inversePath :firstAuthor ];
            sh:minCount 1;
            sh:maxCount 1
    ];                              
    sh:nodeKind sh:IRI.

然而,这看起来很复杂(8 行而不是 3 行)并且容易出错(:firstAuthor 被提到了两次)。有没有更简单的建模方法?

例如,这可能是这样的,但是 sh:inverseMinCount 不存在:

:AuthorShape a sh:NodeShape;
    sh:targetClass :Author;
    sh:property [sh:path :firstAuthor; sh:minCount 1; sh:inverseMinCount 1; sh:inverseMaxCount 1].

:firstAuthor 被提及两次的问题可以通过将 属性 附加到 Book 来避免,例如

:BookShape a sh:NodeShape ;
    sh:targetClass :Book ;
    sh:property [
        sh:path [ sh:inversePath :firstAuthor ] ;
        sh:maxCount 1 ;
    ] .

(您已经拥有 AuthorShape,因此拥有 BookShape 将是一件非常自然的事情)。

在任何情况下你都不需要 sh:minCount 1 因为 sh:targetObjectsOf 已经暗示了这一点,虽然我可以从 UML 的角度理解你为什么想要这个。

而且我认为上面的设计并不比前向复杂得多,前提是您可以接受不可避免的 sh:inversePath 开销。