【问题标题】:Sparql 1.1 get all the instances of a specific classes, but do not include any instances from subclassesSparql 1.1 获取特定类的所有实例,但不包括来自子类的任何实例
【发布时间】:2017-06-12 16:04:48
【问题描述】:

我正在创建基于 RDFS/OWL 的类层次结构,并使用 a (rdf:type) 关系在所有类中创建实例。我想检索特定类的实例,不包括其子类的实例。但是,当我编写一个 SPARQL 查询时,它也会为我提供每个子类的所有实例。

我的本​​体说:

Book是一个类,它有两个子类:hard_bounded_booksoft_binded_books

换句话说(在某些情况下):

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

ex:hard_bounded_book1
        a       ex:hard_bounded_book .
ex:soft_binded_books1a
        a       ex:soft_binded_books .
ex:soft_binded_books  rdfs:subClassOf  ex:Book .
ex:hard_bounded_book  rdfs:subClassOf  ex:Book .
ex:Book  a      rdf:Class .
ex:Book1  a     ex:Book .

当我查询时

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  ex:  <http://book_triples.org/>
SELECT  ?book
WHERE
  { ?book  rdf:type  ex:Book }

它返回所有三个Book1hard_bounded_book1soft_binded_books1,但我只想获得第一个结果 (Book1)。

感谢任何帮助。谢谢。

【问题讨论】:

  • 您使用哪个 API 或三重存储?

标签: sparql owl


【解决方案1】:

无论您的商店中的推理是打开还是关闭,您都可以编写一个只返回特定类的实例的查询,通过 过滤掉所有也是ex:Book子类实例的实例,如下所示:

SELECT  ?book
WHERE { 
  ?book  rdf:type  ex:Book 
  FILTER NOT EXISTS { 
     ?book rdf:type ?c . 
     ?c rdfs:subClassOf+ ex:Book .
     FILTER (?c != ex:Book)  
}

它检查对于返回的每一本书,使该书成为ex:Book 子类的实例的三元组不存在。第二个过滤器(检查?c 不等于ex:Book)是必要的,因为在RDFS 中,每个类都是其自身的子类。

当然,这个查询的运行成本比你原来的简单查询要高,所以如果你的三元存储有一个(暂时)关闭推理的选项,那可能是一个更可取的解决方案。

顺便说一句:subClassOf 模式后面的 + 符号是“1 级或更多级别”运算符,在这里是可选的。如果您希望严格排除所有子类的可能实例,则需要包含它,即使推理器已完成所有推理。鉴于在您的场景中,很可能有一个推理器可以推断出完整的演绎闭包,您可以将其排除在外。

更新为了更详细地解释我关于+ 符号的观点:假设我们有 A、B 和 C 类:B 是 A 的子类,C 是B的子类。

想象一个单独的 x,它被声明为 C 的一个实例。

  1. 没有推理,对于 A 的所有实例的任何查询都不会返回 x,无论我们是否过滤掉查询中的子类。
  2. 使用推理,x 将被推断为 B 类型和 A 类型,因此不带 + 符号的子类过滤器将用于从 结果。

到目前为止一切顺利。 然而,假设我们还插入了 x 是 A 的实例这一明确事实。

如果启用了推理,我们仍然可以处理没有+ 运算符的查询。但是,没有推理,现在对 A 的所有实例的查询都将返回 x,即使 x 也是 A(即 C)的(间接)子类的一个实例。这就是 + 运算符很有帮助的边缘情况。

【讨论】:

  • 谢谢。这解决了问题。 2个问题:有没有办法在查询时暂时关闭推理。如果我不使用 + 号,它会忽略直接子类,从而忽略所有后续子类。真的需要 + 号吗?
  • 问题 1:这取决于您使用的是哪个 Triplestore。问题 2:我将编辑答案以快速概述为什么它可能是必要的。
  • 知道了。再次感谢。
【解决方案2】:

我编辑了您的问题以提供格式正确的输入和查询。我是不是误传了什么?

我真的怀疑这是一个推理或推理问题。您使用的是什么三元存储?你知道推理是否开启?

当我将你的三元组插入到 Blazegraph 中,inference 变成 off,并运行你的查询,我得到了想要的结果:

+----------------------------------------------+
|                     book                     |
+----------------------------------------------+
| <http://book_triples.org/Book1>              |
+----------------------------------------------+

当我打开推理时,我得到你描述的结果:

+----------------------------------------------+
|                     book                     |
+----------------------------------------------+
| <http://book_triples.org/Book1>              |
| <http://book_triples.org/hard_bounded_book1> |
| <http://book_triples.org/soft_binded_books1> |
+----------------------------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2013-04-20
    • 1970-01-01
    • 2021-08-23
    • 2013-10-31
    相关资源
    最近更新 更多