当前位置: 首页 > 知识库问答 >
问题:

SPARQL1.1获取特定类的所有实例,但不包括子类中的任何实例

别俊誉
2023-03-14

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

感谢任何帮助。多谢了。

共有1个答案

马庆
2023-03-14

无论在存储中是否打开或关闭推理,您都可以编写一个查询,该查询只返回特定类的实例,方法是筛选出同时也是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)  
}

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

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

顺便提一下:subclassof模式后面的+符号是一个“1或多个levels deep”运算符,在这里是可选的。如果希望严格排除所有可能的子类实例,则需要包含它,即使推理器已经完成了所有的推理。考虑到在你的场景中很可能有一个推理器来推断出完全的演绎闭包,你可以把它省略掉。

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

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

  1. 如果不进行推断,则针对A的所有实例的任何查询都不会返回x,无论我们是否筛选出查询中的子类。
  2. 通过推理,x将被推断为类型B和类型A,因此没有+符号的子类过滤器将工作以从结果中删除x。

到目前为止还不错。然而,假设我们还插入了x是A的实例这一显式事实。

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

 类似资料:
  • X1.2新增 sp_sql_posts_bycatid($cid,$tag,$where) 功能: 根据分类文章分类ID 获取该分类下所有文章(包含子分类中文章),调用方式同sp_sql_posts 参数: $cid:分类id $tag:查询标签,以字符串方式传入,例:"order:post_date desc,listorder desc;"field:调用post指定字段,如(id,post

  • 问题内容: 我想获取某个类的对象的所有实例。 例如: 应该是或(顺序无关紧要)。 一个加号是,如果该函数将返回具有所请求类的超类的实例,尽管这不是必需的。 我能想到的一种方法是使用包含实例数组的静态类成员变量。在类的构造函数和析构函数中,我将在数组中添加或删除。如果我必须在许多类上这样做,这将很麻烦且容易出错。 问题答案: 如果您从TrackableObject类派生所有对象,则可以将此类设置为处

  • 问题内容: 在Java中,是否有任何可能的方法来获取某个类的所有实例? 问题答案: 实例化类(Singleton模式)时,可以使用Factory静态初始化程序,然后将工厂构造函数中的每个生成的实例添加到List中。 像这样的东西:

  • X1.2新增 sp_sql_posts_paged_bycatid($cid,$tag,$pagesize,$pagetpl) 功能: 根据分类文章分类ID 获取该分类下所有文章(包含子分类中文章),已经分页,调用方式同sp_sql_posts_paged 参数: $cid:分类id $tag:查询标签,以字符串方式传入,例:"field:post_title,post_content;limi

  • 我试图得到trait(接口)的所有实例子类。这个特性有多个实现,由第三方用户提供。 这是否可能得到所有实例子类没有显式绑定,因为我没有控制,实现由第三方用户提供。? 我已经看到了同样的问题,你需要明确地绑定。 代码示例: 这不起作用。任何帮助都将不胜感激!

  • 我有一个名为Attributes的类,它有如下所列的一些实例变量: