如何查询匿名类型的实例?



假设我有一个类(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类的数据和对象属性?(域和范围推理)

相关内容

  • 没有找到相关文章

最新更新