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

时间:2017-06-12 16:04:48

标签: sparql owl

我正在创建一个基于RDFS / OWL的类层次结构,并使用ardf: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)。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

无论是否在商店中打开或关闭推理,您都可以编写一个只返回特定类的实例的查询, 过滤掉所有也是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中,每个类都是其自身的子类。

当然,这个查询比你原来的简单原始版本更昂贵,所以如果你的triplestore有(暂时)关闭推理的选项,那么这可能是一个更好的解决方案。

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

更新为了更详细地解释我对+符号的看法:假设我们有类A,B和C:B是A的子类,C是B的子类。

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

  1. 没有推理,无论是否在查询中过滤掉子类,对所有A实例的任何查询都不会返回x。
  2. 使用推理,x将被推断为类型B和类型A,因此没有+符号的子类过滤器将用于从中删除x 结果。
  3. 到目前为止一切顺利。 然而,假设我们还插入了明确的事实,即x是A的实例。

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

答案 1 :(得分:1)

我编辑了您的问题,以提供格式良好的输入和查询。我歪曲了什么吗?

我真的怀疑这是推理或推理问题。您使用的是什么三元组?你知道是否启用了推理?

当我将三元组插入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> |
+----------------------------------------------+