删除 SPARQL 中不需要的超类答案

问题描述 投票:0回答:1

我有一个包含分类层次结构的 OWL 文件,我想编写一个查询,其中答案包括每个个体及其直接分类父级。这是一个例子(完整的查询相当混乱)。

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http:://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <urn:ex:> .

:fido rdf:type :Dog .
:Dog rdfs:subClassOf :Mammal .
:Mammal rdfs:subClassOf :Vertebrate .
:Vertebrate rdfs:subClassOf :Animal .
:fido :hasToy :bone

:kitty rdf:type :Cat .
:Cat rdfs:subClassOf :Mammal .
:kitty :hasToy :catnipMouse .

这个查询满足了我的要求。

prefix rdf: <http:://www.w3.org/1999/02/22-rdf-syntax-ns#> .
prefix : <urn:ex:> .

SELECT ?individual ?type 
WHERE {
   ?individual :hasToy :bone .
   ?individual rdf:type ?type .
}

问题是我宁愿使用 OWL 文件的经过推理的版本,不出所料,它包含附加语句:

:fido rdf:type :Mammal .
:fido rdf:type :Vertebrate .
:fido rdf:type :Animal .
:kitty rdf:type :Mammal .
:kitty rdf:type :Vertebrate .
:kitty rdf:type :Animal .

现在查询结果是关于 Fido 是哺乳动物等的附加答案。我可以放弃使用文件的推理版本,或者,由于 SPARQL 查询是从 java 调用的,我可以执行一堆附加查询找到出现的包容性最小的类型。我的问题是是否有一个合理的纯SPARQL解决方案只返回Dog解决方案。

sparql owl reasoning
1个回答
3
投票

通用解决方案是确保仅请求 direct 类型。类

C
是实例
x
的直接类型,如果:

  1. x
    属于类型
    C
  2. 不存在
    C'
    使得:
    • x
      属于类型
      C'
    • C'
      C
    • 的子类
    • C'
      不等于
      C

(顺便说一句,最后一个条件是必要的,因为在 RDF/OWL 中,子类关系是自反的:每个类都是其自身的子类)

在 SPARQL 中,这变成了这样:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <urn:ex:> .

SELECT ?individual ?type 
WHERE {
   ?individual :hasToy :bone .
   ?individual a ?type .
   FILTER NOT EXISTS { ?individual a ?other .
                       ?other rdfs:subClassOf ?type .
                       FILTER(?other != ?type)
   }
}

根据您用来执行这些查询的 API/triplestore/库,可能还有其他特定于工具的解决方案。例如,Sesame API(披露:我是 Sesame 开发团队的成员)可以选择禁用单个查询的推理:

TupleQuery query = conn.prepareTupleQuery(SPARQL, "SELECT ...");
query.setIncludeInferred(false); 

TupleQueryResult result = query.evaluate();

Sesame 还提供了一个可选的附加推理器(称为“直接类型推理器”),它引入了您可以查询的附加“虚拟”属性,例如

sesame:directType
sesame:directSubClassOf
等。其他工具无疑也有类似的选项。

© www.soinside.com 2019 - 2024. All rights reserved.