Topbraid Composer 中 SPARQL 中的 SHACL sh:rule 和 sh:condition

SHACL sh:rule with sh:condition in SPARQL in Topbraid Composer

示例 ontology 有两个 类(:MyClass:Value)和两个属性(:MyObjProp:MyDataProp)。

:MyClass
  a owl:Class ;
  a sh:NodeShape ;
  rdfs:subClassOf owl:Thing ;
.
:MyDataProp
  a owl:DatatypeProperty ;
  rdfs:domain :MyClass ;
  rdfs:range xsd:string ;
.
:MyObjProp
  a owl:ObjectProperty ;
  rdfs:domain :MyClass ;
  rdfs:range :Value ;
.
:Value
  a owl:Class ;
  rdfs:subClassOf owl:Thing ;
.

添加了一些实例。

:MyClass_1
  a :MyClass ;
  :MyDataProp :Value_1 ;
  :MyObjProp :Value_1 ;
.
:MyClass_2
  a :MyClass ;
  :MyObjProp :Value_2 ;
.
:Value_1
  a :Value ;
.
:Value_2
  a :Value ;
.

已创建具有 sh:rule (:SPARQLRule_1) 的 NodeShape :NodeShapeRule。此规则创建新的三元组。使用 sh:condition 规则应限制为目标子集。

:NodeShapeRule
  a sh:NodeShape ;
  sh:rule :SPARQLRule_1 ;
  sh:targetClass :MyClass ;
.
:SPARQLRule_1
  a sh:SPARQLRule ;
  sh:condition :NodeShapeConditionSPARQL ;
  sh:construct """
    PREFIX : <http://example.org/ex#>
    CONSTRUCT
    {
        $this :MyDataProp \"New input\" .
    }
    WHERE
    {
        $this :MyObjProp ?p .
    }
    """ ;
.

为了限制,定义了两个等效的 NodeShape。第一个约束适用于 sh:property,另一个使用 sh:sparql.

:NodeShapeConditionProperty
  a sh:NodeShape ;
  sh:property [
      sh:path :MyObjProp ;
      sh:description "NodeShapeConditionProperty" ;
      sh:hasValue :Value_1 ;
    ] ;
  sh:targetClass :MyClass ;
.
:NodeShapeConditionSPARQL
  a sh:NodeShape ;
  sh:sparql [
      sh:message "NodeShapeConditionSPARQL" ;
      sh:prefixes <http://example.org/ex> ;
      sh:select """
        PREFIX : <http://example.org/ex#>
        SELECT $this
        WHERE
        {
            $this :MyObjProp ?prop .
        }
        """ ;
    ] ;
  sh:targetClass :MyClass ;
.

在使用 Topbraid Composer 进行推理时,我收到了两种解决方案的不同结果。只有带有 sh:property 的解决方案才能提供预期的响应。拜托,有人可以向我解释这种行为吗?

:MyClass_1 :MyDataProp "New input"

正确的解释是 SPAQRL 查询对 SELECT 查询中的每个结果(行)产生约束冲突。因此,如果 SPARQL 查询 return 没有结果(行),那么一切都很好,规则将会触发。这种设计的原因是,这使 SPARQL 查询能够 return 有关违规的更多信息,例如焦点节点 ($this) 和值节点 (?value).

更改 :NodeShapeConditionSPARQL 它会针对不存在的结果产生违规行为,然后两种解决方案的行为方式相同。

:NodeShapeConditionSPARQL
  a sh:NodeShape ;
  sh:sparql [
      sh:message "NodeShapeConditionSPARQL" ;
      sh:prefixes <http://example.org/ex> ;
      sh:select """
        PREFIX : <http://example.org/ex#>
        SELECT $this
        WHERE
        {
            FILTER NOT EXISTS { $this :MyObjProp ?anyProp } .
        }
        """ ;
    ] ;
  sh:targetClass :MyClass ;
.