【发布时间】:2015-03-02 15:01:47
【问题描述】:
我正在尝试对一个定义了限制的类编写查询,这将确定是否满足限制,如果满足,则返回它。
一个示例类定义如下:
:ThingB a owl:Class ;
rdfs:subClassOf :ThingA ;
rdfs:subClassOf [ a owl:Restriction ;
owl:allValuesFrom [ a owl:Class ;
owl:intersectionOf ( :ThingC :ThingD )
] ;
owl:onProperty owl:isConfirmedBy
] ;
rdfs:subClassOf [ a owl:Restriction ;
owl:onProperty owl:isConfirmedBy ;
owl:someValuesFrom [ a owl:Class ;
owl:unionOf ( :ThingE :ThingF :ThingG :ThingH )
]
] .
我希望能够编写一个查询,说明如果我同时拥有 ThingC 和 ThingD 以及 ThingE、ThingF、ThingG 或 ThingH 中的任何一个,则返回 ThingB。
以下查询将执行第一部分,即仅当我同时拥有 ThingC 和 ThingD 时才返回 ThingB:
SELECT
*
WHERE
{
?thing rdfs:subClassOf ?restriction .
?restriction (owl:allValuesFrom | owl:someValuesFrom)/(owl:intersectionOf | owl:unionOf) ?list .
FILTER NOT EXISTS {
?list rdf:rest*/rdf:first ?things.
FILTER( !(?things in (:ThingC, :ThingD )) )
}
}
我如何包含限制的第二部分,即必须至少有 ThingE、ThingF、ThingG 或 ThingH 之一才能返回 ThingB 上的匹配项?
【问题讨论】:
-
我对此很感兴趣。我可以让你的本体试一试吗?我没有的本体有这种情况,所以我的努力没有任何结果!
-
@Artemis 感谢您的回复,但我无法向您提供我们的本体。希望我上面给出的示例足够详细,以便您能够在自己的本体中复制问题。
-
您是否要验证您的 abox wrt 到您的 tbox?
-
@Michael 我不得不承认我不完全理解你的问题,因为我对本体和 SPARQL 很陌生。从我刚刚简要阅读的有关 abox 和 tbox 术语的内容来看,我认为我所要求的可以像您所说的那样简洁地描述,但我不确定。用我更简单的术语来说,我已经对我的类定义了限制,我希望能够运行一个查询,该查询将返回其限制已被一组输入值满足的任何类。
-
Person 是一个类的例子,这些在你的 tbox 中。你可以说“所有人都必须只有一个年龄”——这就是你正在考虑的那种限制,是吗?如果有个人“迈克尔”(在您的 abox 中),您想知道他们是否有年龄,因此,限制是否“满足”。也就是说,检查您的 abox 是否对您的 tbox 有效。对吗?