4

假设我有一个类 ( 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 ;
                ] ;
            ] ;
        ] ;
    ] ;
}
4

2 回答 2

3

Stardog(从 2.1 版开始)不支持通过推理检索匿名类的实例。但是,在您的示例中,您可以简单地运行查询而无需推理,并且您应该得到预期的结果,因为个人是直接使用限制输入的。

于 2014-02-06T16:54:58.613 回答
1

如果您正在寻找具有复杂类表达式类型的个体,并且您正在 SPARQL 中执行此操作,那么您需要知道 OWL 类表达式是如何在 RDF 中序列化的。例如,考虑以下本体,其中一个个体,bucket42具有复杂类型:

bucket42 : Barrel ⊓ (hasApple only GoodApple)

这实际上有点像神话,因为每个桶里都有一个坏苹果,但这不是重点。这是本体:

@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 .

现在,您在这里有一些选择。您可以要求实际上具有该交叉点类型的东西,但这可能不是最好的路线,因为如果某些东西已被声明为Barrel并被声明为hasApple only GoodApple,您可能仍想选择它。根据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 推论,但您可以获得比您最初预期的更多的信息。

参考

正如我在评论中提到的那样,最近出现了许多相关问题,至少略读它们以了解您可以做什么可能会很有用。以下是我能够快速找到的一些内容:

于 2014-02-06T20:36:55.260 回答