ORIENTDB:遍历/带属性的边
ORIENTDB: traverse / edges with attributes
我在图形数据库中有一个与应用程序权限相关的问题。结构如下...我必须读取与节点相关的用户的角色。节点是分层组织的,角色作为边提供,包含类型属性和关系 User -> UserRole {type:xyz} -> Node
create class User extends V
create class Node extends V
create class has_father extends E
create class UserRole extends E
create vertex User set name = 'u1'
create vertex User set name = 'u2'
create vertex User set name = 'u3'
create vertex Node set name = 'n1'
create vertex Node set name = 'n11'
create vertex Node set name = 'n12'
create vertex Node set name = 'n111'
create vertex Node set name = 'n112'
create vertex Node set name = 'n1111'
create vertex Node set name = 'n1112'
create vertex Node set name = 'n11111'
create vertex Node set name = 'n11112'
create edge has_father from (select from Node where name = 'n11') to (select from Node where name = 'n1')
create edge has_father from (select from Node where name = 'n12') to (select from Node where name = 'n1')
create edge has_father from (select from Node where name = 'n111') to (select from Node where name = 'n11')
create edge has_father from (select from Node where name = 'n112') to (select from Node where name = 'n11')
create edge has_father from (select from Node where name = 'n1111') to (select from Node where name = 'n111')
create edge has_father from (select from Node where name = 'n1112') to (select from Node where name = 'n111')
create edge has_father from (select from Node where name = 'n11111') to (select from Node where name = 'n1111')
create edge has_father from (select from Node where name = 'n11112') to (select from Node where name = 'n1111')
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n1') set type = 'admin'
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n11') set type = 'read'
create edge UserRole from (select from User where name = 'u2') to (select from Node where name = 'n111') set type = 'write'
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n11111') set type = 'test'
实际上我现在必须读取 "n" 中的所有子项并获取用户 "u1" 的节点和用户角色:
要求 "u1" 和 "n1":
n11 read
n12 admin
要求 "u1" 和 "n1111":
n11111 test
n11112 read
意味着最多分配了 1 个 UserRole,该值可能会在树中被覆盖。用户可能是
根级别的管理员,只能从 n11 级别读取。
我如何读取传递父节点 @rid(或过滤器)的子节点以及为特殊用户计算的角色?
试试这个 SQL 作为你的第二个例子:
select name as Name, $a.type[0] as Role from (select expand(in('has_father')) from (select from Node where name = 'n1111') unwind in)
let $a=(select inE('UserRole').type as type from (
traverse out('has_father'),in('UserRole') from $parent.$current while out('UserRole').@rid <> #21:0
) where in('UserRole').@rid = #21:0
limit 1
)
其中 #21:0 是 u1
@rid.
只要这不是很漂亮,您可以将其插入 JS 函数并对其进行参数化。
我在图形数据库中有一个与应用程序权限相关的问题。结构如下...我必须读取与节点相关的用户的角色。节点是分层组织的,角色作为边提供,包含类型属性和关系 User -> UserRole {type:xyz} -> Node
create class User extends V
create class Node extends V
create class has_father extends E
create class UserRole extends E
create vertex User set name = 'u1'
create vertex User set name = 'u2'
create vertex User set name = 'u3'
create vertex Node set name = 'n1'
create vertex Node set name = 'n11'
create vertex Node set name = 'n12'
create vertex Node set name = 'n111'
create vertex Node set name = 'n112'
create vertex Node set name = 'n1111'
create vertex Node set name = 'n1112'
create vertex Node set name = 'n11111'
create vertex Node set name = 'n11112'
create edge has_father from (select from Node where name = 'n11') to (select from Node where name = 'n1')
create edge has_father from (select from Node where name = 'n12') to (select from Node where name = 'n1')
create edge has_father from (select from Node where name = 'n111') to (select from Node where name = 'n11')
create edge has_father from (select from Node where name = 'n112') to (select from Node where name = 'n11')
create edge has_father from (select from Node where name = 'n1111') to (select from Node where name = 'n111')
create edge has_father from (select from Node where name = 'n1112') to (select from Node where name = 'n111')
create edge has_father from (select from Node where name = 'n11111') to (select from Node where name = 'n1111')
create edge has_father from (select from Node where name = 'n11112') to (select from Node where name = 'n1111')
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n1') set type = 'admin'
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n11') set type = 'read'
create edge UserRole from (select from User where name = 'u2') to (select from Node where name = 'n111') set type = 'write'
create edge UserRole from (select from User where name = 'u1') to (select from Node where name = 'n11111') set type = 'test'
实际上我现在必须读取 "n" 中的所有子项并获取用户 "u1" 的节点和用户角色:
要求 "u1" 和 "n1":
n11 read
n12 admin
要求 "u1" 和 "n1111":
n11111 test
n11112 read
意味着最多分配了 1 个 UserRole,该值可能会在树中被覆盖。用户可能是 根级别的管理员,只能从 n11 级别读取。
我如何读取传递父节点 @rid(或过滤器)的子节点以及为特殊用户计算的角色?
试试这个 SQL 作为你的第二个例子:
select name as Name, $a.type[0] as Role from (select expand(in('has_father')) from (select from Node where name = 'n1111') unwind in)
let $a=(select inE('UserRole').type as type from (
traverse out('has_father'),in('UserRole') from $parent.$current while out('UserRole').@rid <> #21:0
) where in('UserRole').@rid = #21:0
limit 1
)
其中 #21:0 是 u1
@rid.
只要这不是很漂亮,您可以将其插入 JS 函数并对其进行参数化。