假设我有一个类(cls
),一个对象属性(has_part
)和单个(ind
)。 个人是rdf:type'd是(在曼彻斯特语法中)(has_part only cls)
。 基本上,个人被称为匿名类,作为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
}
如果是这样,那么也许星狗对我代表的另一部分提出了异议。
编辑 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
}
然而,正如约书亚在下面指出的那样,这只会挑选被指定为该类型的个人,这意味着一个被断言为clsa
然后被断言为(has_part only clsb)
的个人不会被选中,这不是我们最有可能想要的。
我仍在尝试让约书亚的查询起作用,但对我来说看起来不错。 (我有点像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 ;
] ;
] ;
] ;
] ;
}
Stardog(从2.1版本开始)不支持通过推理检索匿名类的实例。但是,在您的示例中,您可以简单地运行查询而无需推理,并且您应该获得预期的结果,因为个人是直接使用限制键入的。
如果你正在寻找具有复杂类表达式类型的个人,并且你在SPARQL中执行此操作,你需要知道OWL类表达式是如何在RDF中序列化的。 例如,考虑以下本体,其中单个barrel42具有复杂类型:
barrel42 : 桶 ⊓ (只有苹果好苹果)
这实际上有点神话,因为每个桶里都有一个坏苹果,但这不是重点。 这是本体:
@prefix : <https://stackoverflow.com/q/21607859/1281433/example#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<https://stackoverflow.com/q/21607859/1281433/example>
a owl:Ontology .
:barrel42 a owl:NamedIndividual ;
a [ a owl:Class ;
owl:intersectionOf ( :Barrel [ a owl:Restriction ;
owl:allValuesFrom :GoodApple ;
owl:onProperty :hasApple
] )
] .
:GoodApple a owl:Class ;
rdfs:subClassOf :Apple .
:Apple a owl:Class .
:hasApple a owl:ObjectProperty .
:BadApple a owl:Class ;
rdfs:subClassOf :Apple .
:Barrel a owl:Class .
现在,您在这里有一些选择。 你可以要求实际上具有这种交叉类型的东西,但这可能不是最好的路线,因为如果某物被声明为桶并声明为只有苹果的好苹果,你仍然可能想要选择它。 根据 OWL 交集类隐含的检索超类的答案,我们可以编写如下查询:
prefix : <https://stackoverflow.com/q/21607859/1281433/example#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
select ?individual where {
?individual
a/(owl:intersectionOf/rdf:rest*/rdf:first)*
:Barrel,
[ owl:allValuesFrom :GoodApple ;
owl:onProperty :hasApple ;
a owl:Restriction ] .
}
--------------
| individual |
==============
| :barrel42 |
--------------
属性路径
a/(owl:intersectionOf/rdf:rest*/rdf:first)*
确实是这里的重要部分。 我们正在寻找?individual
的类型,我们也将通过交集类来找到交集类的超类。 我们可能还希望包含其他"推理路径"。 例如,我们可能会合并rdfs:subClassOf
链接:
a/((owl:intersectionOf/rdf:rest*/rdf:first)|rdfs:subClassOf)*
如果您查看其他类表达式,则可以想出其他方法来扩展路径。这不能让你得到所有的OWL推论,但你可以得到比你最初预期的更多。
引用
正如我在评论中提到的,最近有许多相关问题,至少浏览一下它们以了解您可以做什么可能会有所帮助。 以下是我能够快速找到的一些:
- 检索 OWL 交集类隐含的超类
- 使用SPARQL推理的基本技术?
- Sparql 查询子类或等效到
- 使用SPARQL进行有限的RDFS和OWL推理
- 如何使用SPARQL获取OWL类的数据和对象属性?(域和范围推理)