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

Rdf 中间节点上带有断言的属性链,rdf,owl,ontology,graphdb,reasoning,Rdf,Owl,Ontology,Graphdb,Reasoning,我有一个用例,我试图推断某个特定用户是否具有对资源的管理员访问权限。我用的是GraphDB 我的本体包含用户、角色、权限和资源。一个用户可以有N个角色。每个角色都有不同的权限,其中一个是管理权限。每个角色都适用于特定的资源 因此,我试图推断的是一种直接关系,表明用户具有对资源的管理员访问权限。我正试图使PropertyChains和角色化适合我的用例,但我并没有完全让它工作。我不确定这条路是否正确 我在这里起草了一份本体: @prefix : <https://stackover

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

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

因此,我试图推断的是一种直接关系,表明用户具有对资源的管理员访问权限。我正试图使PropertyChains和角色化适合我的用例,但我并没有完全让它工作。我不确定这条路是否正确

我在这里起草了一份本体:

@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 .
@前缀:。
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
猫头鹰:本体论。
:hasRole a owl:ObjectProperty;
rdfs:域:用户;
范围:角色。
:roleHasPermission a owl:ObjectProperty;
rdfs:域:角色;
rdfs:范围:权限;
:appliesToResource一个owl:ObjectProperty;
rdfs:域:角色;
范围:资源。
:userHasAdminPermission a owl:ObjectProperty;
rdfs:域:用户;
范围:资源。
:User a owl:Class。
:角色a猫头鹰:类。
:权限猫头鹰:类。
:资源a猫头鹰:类。
:AdminPermission a:权限。
:其他权限a:权限。

使用
owl:propertyChainAxiom
可以实现这一点,但需要在与特定资源相关的数据(
:AdminPermission
)中引入独特的“节点特定循环”,并在目标链中使用

棘手的部分是这种“循环”的产生。实现这一点的一种方法是结合使用反向属性和两个限制条件的相互作用,即
owl:hasValue
kind,以便围绕特定的目标节点导出这些限制条件

让我们介绍一个类
: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) .
以及要检查的示例查询:

describe :Ron
将显示:
:Ron:userHasAdminPermission:Archive

describe :Ron