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 ;
.
示例 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 ;
.