Sparql 1.1 获取特定 类 的所有实例,但不包括来自子 类 的任何实例
Sparql 1.1 get all the instances of a specific classes, but do not include any instances from subclasses
我正在基于 RDFS/OWL 创建一个 class 层次结构,并使用 a
(rdf:type
) 关系在所有 class 中创建实例.我想检索特定 class 的实例,不包括其 children 的实例。但是,当我编写 SPARQL 查询时,它也为我提供了每个 child class 的所有实例。
我的 ontology 说:
Book
是一个 class,它有两个子 class:hard_bounded_book
和 soft_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 }
它 returns 所有三个 Book1
、hard_bounded_book1
、soft_binded_books1
,但我只想得到第一个结果 (Book1
)。
感谢任何帮助。谢谢。
我编辑了您的问题以提供格式正确的输入和查询。我有没有误报什么?
我真的怀疑这是一个推论或推理问题。你用的是什么triplestore?你知道推理有没有开启?
当我将你的三元组插入 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> |
+----------------------------------------------+
无论您的商店中的推理是打开还是关闭,您都可以编写一个仅 return 特定 class 实例的查询,通过
过滤掉所有也是 ex:Book
的子 class 实例的实例,像这样:
SELECT ?book
WHERE {
?book rdf:type ex:Book
FILTER NOT EXISTS {
?book rdf:type ?c .
?c rdfs:subClassOf+ ex:Book .
FILTER (?c != ex:Book)
}
它检查每本书 returned,不存在使该书成为 ex:Book
的子class 实例的三元组。第二个过滤器(检查 ?c
不等于 ex:Book
)是必要的,因为在 RDFS 中,每个 class 都是其自身的子 class。
当然,对于 运行 来说,此查询比您拥有的简单原始查询更昂贵,因此,如果您的三元存储可以选择(暂时)关闭推理,那可能是一个更可取的解决方案。
顺便说一句:subClassOf
模式后面的 +
符号是“1 层或更多层深”运算符,在这里是可选的。如果您希望严格排除 所有 可能的子 class 实例,则需要包括它,即使推理者已完成所有推理。鉴于在您的场景中很可能有一个推理器可以推断出完整的演绎闭包,您可以将其排除在外。
更新 更详细地解释一下我关于 +
符号的观点:假设我们有 classes A、B 和 C : B 是 A 的子class,C 是 B 的子class。
想象一个单独的 x,它被声明为 C 的一个实例。
- without inference, any query for all instances A will not return x, 无论我们是否在查询中过滤掉子classes .
- with 推理,x 将被推断为 B 类型和 A 类型,因此没有
+
的 subclass-filter符号将用于从中删除 x
结果。
到目前为止一切顺利。 但是,假设我们还插入了明确的事实,即 x 是 A 的一个实例。
如果启用推理,我们仍然可以在没有 +
运算符的情况下进行查询。但是,没有 推理,对 A 的所有实例的查询现在将 return x,即使 x 也是(间接)子 class 的实例A(即C)。这是 +
运算符有用的边缘情况。
我正在基于 RDFS/OWL 创建一个 class 层次结构,并使用 a
(rdf:type
) 关系在所有 class 中创建实例.我想检索特定 class 的实例,不包括其 children 的实例。但是,当我编写 SPARQL 查询时,它也为我提供了每个 child class 的所有实例。
我的 ontology 说:
Book
是一个 class,它有两个子 class:hard_bounded_book
和 soft_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 }
它 returns 所有三个 Book1
、hard_bounded_book1
、soft_binded_books1
,但我只想得到第一个结果 (Book1
)。
感谢任何帮助。谢谢。
我编辑了您的问题以提供格式正确的输入和查询。我有没有误报什么?
我真的怀疑这是一个推论或推理问题。你用的是什么triplestore?你知道推理有没有开启?
当我将你的三元组插入 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> |
+----------------------------------------------+
无论您的商店中的推理是打开还是关闭,您都可以编写一个仅 return 特定 class 实例的查询,通过
过滤掉所有也是 ex:Book
的子 class 实例的实例,像这样:
SELECT ?book
WHERE {
?book rdf:type ex:Book
FILTER NOT EXISTS {
?book rdf:type ?c .
?c rdfs:subClassOf+ ex:Book .
FILTER (?c != ex:Book)
}
它检查每本书 returned,不存在使该书成为 ex:Book
的子class 实例的三元组。第二个过滤器(检查 ?c
不等于 ex:Book
)是必要的,因为在 RDFS 中,每个 class 都是其自身的子 class。
当然,对于 运行 来说,此查询比您拥有的简单原始查询更昂贵,因此,如果您的三元存储可以选择(暂时)关闭推理,那可能是一个更可取的解决方案。
顺便说一句:subClassOf
模式后面的 +
符号是“1 层或更多层深”运算符,在这里是可选的。如果您希望严格排除 所有 可能的子 class 实例,则需要包括它,即使推理者已完成所有推理。鉴于在您的场景中很可能有一个推理器可以推断出完整的演绎闭包,您可以将其排除在外。
更新 更详细地解释一下我关于 +
符号的观点:假设我们有 classes A、B 和 C : B 是 A 的子class,C 是 B 的子class。
想象一个单独的 x,它被声明为 C 的一个实例。
- without inference, any query for all instances A will not return x, 无论我们是否在查询中过滤掉子classes .
- with 推理,x 将被推断为 B 类型和 A 类型,因此没有
+
的 subclass-filter符号将用于从中删除 x 结果。
到目前为止一切顺利。 但是,假设我们还插入了明确的事实,即 x 是 A 的一个实例。
如果启用推理,我们仍然可以在没有 +
运算符的情况下进行查询。但是,没有 推理,对 A 的所有实例的查询现在将 return x,即使 x 也是(间接)子 class 的实例A(即C)。这是 +
运算符有用的边缘情况。