在 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 开销。
我们想要将带有基数的 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 开销。