属性 在中间节点上带有断言的链

Property Chains with assertions on intermediate nodes

我有一个用例,我试图推断特定用户是否具有对资源的管理员访问权限。我正在使用 GraphDB。

我的 ontology 包含用户、角色、权限和资源。一个用户可以有 N 个角色。每个角色都有不同的权限,其中之一是管理权限。每个角色适用于特定的资源。

所以我想推断的是一个直接关系,表明用户对资源具有管理员访问权限。我试图让 PropertyChains 和 rolification 适合我的用例,但我并没有完全让它发挥作用。我不确定那是否是正确的道路。

我在这里起草 ontology 的这篇文章:

@prefix :      <https://whosebug.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://whosebug.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 类型限制的相互作用的组合来实现,以便围绕特定目标节点导出它们。

让我们引入一个class :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 的每个成员都必须与 [=21= 相关] 到 :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