gpt4 book ai didi

Sparql 1.1 获取特定类的所有实例,但不包括子类的任何实例

转载 作者:行者123 更新时间:2023-12-02 08:57:58 24 4
gpt4 key购买 nike

我正在创建一个基于 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)。

感谢任何帮助。谢谢。

最佳答案

无论您的商店中是否打开或关闭推理,您都可以编写一个仅返回特定类的实例的查询,方法是过滤掉所有也是 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)的实例。这是 + 运算符有用的边缘情况。

关于Sparql 1.1 获取特定类的所有实例,但不包括子类的任何实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44503942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com