如何查询匿名输入的实例?

时间:2014-02-06 16:00:34

标签: semantic-web owl ontology stardog

假设我有一个类(cls),一个对象属性(has_part)和一个个体(ind)。个人是rdf:类型' d(用manchester语法)(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
}

如果是这样,那么也许stardog对我的另一部分代表提出了异议。

编辑2

约书亚·泰勒在下面提供了一个很好的答案。我还在处理它,但似乎听起来很合理。

我想写下为什么上面的查询在OWLIM中工作但在Stardog中没有。 OWLIM会在插入时预先计算所有推断。这意味着,使用上面的示例,(clsa and (has_part only clsb))ind被直接声明为clsa(has_part only clsb)类型。 Stardog没有这样做,这意味着ind只被推断为(has_part only clsb),因为(如下所述)Stardog不支持通过推理检索匿名类的实例,所以这些都没有被提取。 / p>

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)的个人会不被接受,这不是我们最想要的。

我仍然试图让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 ;
                ] ;
            ] ;
        ] ;
    ] ;
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  

桶42:桶⊓(hasApple 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 GoodApple ,你仍然可能想要选择它。根据{{​​3}}的答案,我们可以编写如下查询:

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推断,但你可以得到比你最初预期更多的东西。

参考

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