我有一个OWL模型,它具有范围为xsd:boolean
的数据属性hasToken
,因此它可以具有值true
或false
。假设hasToken
的域是类X
。另一个类Z
是对象属性的域,比如范围为classX
的p
。
Z
----p
---->X
-hasToken
->true
/false
类Z
的每个实例可以具有p
到类X
的实例的多个断言。通过SPARQL,我想获得Z
的所有实例,对于属性p
中的所有对象,只有X
的实例的hasToken
等于true
。因此,如果Z
的一个实例沿着p
甚至有一个X
的实例,即沿着hasToken
的false
,那么它就是我不感兴趣的Z
示例:
x1
-hasToken
->true
x2
-hasToken
->false
x3
---hasToken
--->true
x4
---hasToken
--->false
x5
-hasToken
--->false
z1
-p->x1
z1
--p->x2
z1
--p->x3
z2
---p->x1
z2
--p->x3
z3
-p->x1
z3
--p->x3
z3
--p->x5
查询应该只返回z2
,因为z1
和z3
都至少有一个x
,而hasToken
为假
对于q
owl:inverseOf
p
,以下操作有效。
SELECT ?z1
WHERE {
?z1 a :Z.
?x :q ?z1.
?x :hasToken true.
MINUS {
?x1 :hasToken true.
?x2 :hasToken false.
?x1 :q ?z1.
?x2 :q ?z2.
filter ((?z1=?z2))
}
}