假设我有一个类 ( cls
)、一个对象属性 ( has_part
) 和一个个体 ( ind
)。个人是 rdf:type'd to be (in manchester syntax) (has_part only cls)
。基本上,个人被说成是作为 part 的匿名类cls
。
使用 stardog 作为三重存储,我将如何编写一个查询来提取所有类型的个人(has_part only cls)
?
使用 OWLIM 作为三重存储,我能够编写以下内容:
select ?ind where {
?ind rdf:type ?restriction .
?restriction owl:onProperty has_part .
?restriction owl:allValuesFrom cls
}
据我所知,这在 Stardog 中不起作用,无论我使用什么推理级别。这个查询应该怎么看?
谢谢!
编辑 1
我想我过度简化了。如果个人有更复杂的类型,例如(clsa and (has_part only clsb))
,下面的查询应该工作吗?
select ?ind where {
?ind rdf:type ?restriction .
?restriction owl:onProperty has_part .
?restriction owl:allValuesFrom clsB
}
如果是这样,那么也许stardog 对我的另一部分陈述提出了异议。
编辑 2
约书亚泰勒在下面提供了一个很好的答案。我仍然在解决它的过程中,但它似乎是合理的。
我想写下为什么上述查询在 OWLIM 中有效,但在 Stardog 中无效。OWLIM 在插入时预先计算所有推论。这意味着,使用上面的示例,(clsa and (has_part only clsb))
,ind
被断言为类型clsa
和(has_part only clsb)
直接。Stardog 不这样做,这意味着ind
仅推断为(has_part only clsb)
,并且由于(如下所述)Stardog 不支持通过推理检索匿名类的实例,因此不会拾取这些实例。
Stardog 的等效查询可能是
select ?ind where {
?ind rdf:type ?anon.
?anon owl:intersectionOf ?a .
?a rdf:first clsa .
?a rdf:rest ?b .
?b rdf:first ?restriction .
?b rdf:rest rdf:nil .
?restriction owl:onProperty has_part .
?restriction owl:allValuesFrom clsB
}
然而,正如 Joshua 在下面指出的那样,这只会选择被指定为特定类型的个人,这意味着不会选择被断言为clsa
然后被断言为的个人(has_part only clsb)
,这不是我们最想要的可能。
我仍在尝试让 Joshua 的查询正常工作,但它对我来说看起来不错。(我是一个 SPARQL 新手,但我快到了。)
谢谢您的帮助!
编辑 3
上面的查询没有所有中间变量:
select ?ind where {
?ind rdf:type [
owl:intersectionOf [
rdf:first clsa ;
rdf:rest [
rdf:rest rdf:nil ;
rdf:first [
owl:onProperty has_part ;
owl:allValuesFrom clsB ;
] ;
] ;
] ;
] ;
}