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

问题描述

我有一个用例,我试图推断特定用户是否对资源具有管理员访问权限。我正在使用 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...