属性 在中间节点上带有断言的链
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
我有一个用例,我试图推断特定用户是否具有对资源的管理员访问权限。我正在使用 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