owl - RDFS 的 RDFS-Plus 推理:GraphDB 中的域和范围
问题描述
考虑两个具有不同推理规则集的 GraphDB 存储库:
- 带有规则集“RDFS(优化)”的回购 A
- 带有规则集“RDFS-Plus(优化)”的回购 B
我在这两个存储库中执行了以下 SPARQL INSERT:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ex: <http://www.example.com#>
INSERT DATA {
ex:hasPet a owl:ObjectProperty;
rdfs:domain ex:Human;
rdfs:range ex:Pet.
ex:someHuman ex:hasPet ex:somePet.
}
在这两个存储库中,我希望通过rdfs:domain
and rdfs:range
,应该推断出以下类断言:
ex:someHuman rdf:type ex:Human
ex:somePet rdf:type ex:Pet
rdfs:domain
并且rdfs:range
是 RDFS 属性,因此应该为Repo A推断它们。而且因为 RDFS-Plus 是 RDFS 的扩展,我认为它们也会在Repo B中被推断出来。
然而,这些三元组只能通过规则集 RDFS ( Repo A ) 推断出来。如果我执行以下 SPARQL 查询,我只会在 Repo A 中得到结果,而在Repo B中没有结果。
PREFIX ex: <http://www.example.com#>
SELECT ?pet WHERE {
?pet a ex:Pet.
}
有人能告诉我为什么上面的两个三元组只能用 RDFS 规则集推断,而不能用 RDFS-Plus 规则集推断吗?
解决方案
将我的解决方案发布为答案,以便将来遇到此问题的人不必深入研究上面的评论。
正如@DamyanOgnyanov 在对我的问题的评论中指出的那样,基于而不包含rdfs:domain
在rdfs:range
GraphDB的 RDFS-Plus 和 RDFS-Plus(优化)规则集中推断类型的必要规则。但是,它们包含在 RDFS 规则集中,这是违反直觉的,因为 RDFS 应该是 RDFS-Plus 的基础。
为了使 RDFS-Plus 规则集成为 RDFS 规则集的适当扩展并获得对rdfs:domain
and的支持rdfs:range
,我在 RDFS-Plus 中添加了以下 RDFS 规则。可以在以下位置找到规则集文件<your-graphdb-folder>/configs/rules
Id: rdfs2
a b c [Constraint b != <rdf:type>]
b <rdfs:domain> d
------------------------------------
a <rdf:type> d
Id: rdfs3
a b c
b <rdfs:range> d
------------------------------------
c <rdf:type> d
此外,我还将IDrdfs6
为 , rdfs7
,rdfs12
的规则rdfs13
从 RDFS 添加到 RDFS-Plus。
我没有添加规则rdfs5
,rdfs9
和rdfs11
。规则rdfs5
和rdfs11
被传递属性规则rdfs9
所覆盖,并且被公理和规则所覆盖psys:transitiveOver
。
编辑:当我使用已编辑的 RDFS-Plus 规则集创建新存储库时,GraphDB 没有接受这些更改。我必须选择“上传自定义规则集”并上传我编辑过的规则集(即仍然具有默认名称的 RDFS-Plus 规则集)。
推荐阅读
- c# - 碰撞后触发定时器
- java - Gradle“实现”依赖项未使用正确的代码编译
- c# - 从 C# 中的多级集合中删除项目
- angular - 在 *ngFor 中使用 ng-class 有条件地格式化 Angular 11 中的表格单元格
- arrays - 如何在 mongoimport 中指定多个嵌套文档?
- c# - 带有 if 块 C# 的自定义系统属性
- javascript - 在 ExtJS 中使 EasyGridCombo 成为必需
- sql - 从 BQ 中刚刚过期的视图中查询
- spring-boot - JPA 不能在不删除双方的情况下删除 ManyToMany
- reactjs - 如何确定将什么状态传递给子组件