假设我有一个类(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 ;
] ;
] ;
] ;
] ;
}
答案 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推断,但你可以得到比你最初预期更多的东西。
正如我在评论中提到的,最近出现了许多相关问题,至少可以略过它们来了解你能做些什么。以下是我能够快速找到的一些内容: