问题描述
我有一个用例,我试图推断特定用户是否对资源具有管理员访问权限。我正在使用 GraphDB。
我的本体包含用户、角色、权限和资源。一个用户可以有 N 个角色。每个角色都有不同的权限,其中之一是管理权限。每个角色适用于特定的资源。
所以我试图推断的是一个直接关系,表明用户对资源具有管理员访问权限。我正在尝试使 PropertyChains 和 rolification 适合我的用例,但我并没有完全使它起作用。我不确定这是否是正确的道路。
我在这里起草了这个本体:
@prefix : <https://stackoverflow.com/myQuestion#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-Syntax-ns#> .
<https://stackoverflow.com/myQuestion>
a owl:Ontology .
:hasRole a owl:ObjectProperty ;
rdfs:domain :User ;
rdfs:range :Role .
:roleHasPermission a owl:ObjectProperty ;
rdfs:domain :Role ;
rdfs:range :Permission ;
:appliesToResource a owl:ObjectProperty ;
rdfs:domain :Role ;
rdfs:range :Resource .
:userHasAdminPermission a owl:ObjectProperty ;
rdfs:domain :User ;
rdfs:range :Resource .
:User a owl:Class .
:Role a owl:Class .
:Permission a owl:Class .
:Resource a owl:Class .
:AdminPermission a :Permission .
:OtherPermission a :Permission .
解决方法
使用 owl:propertyChainAxiom
可以实现这一点,但需要在与特定资源 (:AdminPermission
) 相关的数据中引入独特的“节点特定循环”并在目标链中使用它.
棘手的部分是这种“循环”的产生。一种方法可以通过组合使用逆属性和具有两个 owl:hasValue
类型限制的相互作用来实现,以便在特定目标节点周围派生这些限制。
让我们引入一个类 :AdminRole
作为这些的占位符:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
:roleHasAdminPermission owl:inverseOf :adminPermissionAppliesToRole .
:AdminRole rdfs:subClassOf :Role;
owl:equivalentClass [
a owl:Restriction ;
owl:onProperty :roleHasPermission;
owl:hasValue :AdminPermission
];
owl:equivalentClass [
a owl:Restriction ;
owl:onProperty :roleHasAdminPermission;
owl:hasValue :AdminPermission
] .
:userHasAdminPermission owl:propertyChainAxiom
(:hasRole :roleHasPermission :adminPermissionAppliesToRole :appliesToResource) .
每当一个节点与 :roleHasPermission
到 :AdminPermission
相关时,它成为 :AdminRole
的成员,并且 :AdminRole
的每个成员必须分别与 :roleHasAdminPermission
相关联:AdminPermission
接下来,将 :adminPermissionAppliesToRole
作为 :roleHasAdminPermission
的倒数引入,从而创建我们所追求的循环。
剩下的就是通过该循环定义 owl:propertyChainAxiom
以导出用户和资源之间的 :userHasAdminPermission
。
检查一些示例数据(使用 owl2-rl 推理):
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
insert data {
:Administrator a :Role ;
:roleHasPermission :AdminPermission .
:Administrator :appliesToResource :Archive .
:Clerk a :Role ;
:roleHasPermission :OtherPermission .
:Clerk :appliesToResource :SomethingOther .
:Ron a :User;
:hasRole :Administrator .
:Jane a :User;
:hasRole :Clerk .
}
以及要检查的示例查询:
describe :Ron
将显示:
:Ron :userHasAdminPermission :Archive
HTH