sql - OrientDB Select on two related vertex -
i want query database following result,
user resource permissions edi plan [view] where
resource.name = 'plan a' , user.name = 'edi' my query above
select name, out('hasarole').out('oftype').in('isoftype')[name = 'plan a'].name, set(out('hasarole').out('hasa').name) permission user name = 'edi' it should display
user resource permissions adrian plan [view,edit, delete] if change to,
where
resource.name = 'plan a' , user.name = 'adrian' my query above is
select name, out('hasarole').out('oftype').in('isoftype')[name = 'plan a'].name, set(out('hasarole').out('hasa').name) permission user name = 'adrian' now above queries work long users don't have role on type of resource. e.g. if edi had admin role on let's resource type of workspace query gives me permissions admin have , instead of view has view permission on plan a
i have used following graph answer. note have corrected incositencies original edges.
i see number of possible queries problem. bit confused why want return user , resource in query, have these records due fact use them create query. can't 'nest' full records in results either (unless json them). further this, querying on name field, , returning name field seem little nonsensical me - maybe have done simplify question. regardless, following queries on way desired results.
my first idea run query of roles related resource. run query on these results filter roles include user. looks following;
select ( select expand(out('isoftype').in('oftype')) resource name = "plan a" ) in('hasarole') contains first((select user name = "edi")) this query correctly returns viewer record both edi , adrian.
my second idea run 1 query roles related resource (similar above), , roles related user, , find intersect. looks following, , gives same results query above;
select expand(intersect) ( select intersect($resource_roles, $user_roles) let $resource_roles = (select expand(out('isoftype').in('oftype')) resource name = "plan a"), $user_roles = (select expand(out('hasarole')) user name = "edi") ) now if want user, resource , permissions in 1 result, can use following, or variant of;
select first($user).name user, first($resource).name resource, intersect(resource_roles, user_roles).name permissions ( select $resource.out('isoftype').in('oftype') resource_roles, $user.out('hasarole') user_roles let $resource = (select resource name = "plan a"), $user = (select user name = "edi") ) or
select first($user).name user, first($resource).name resource, intersect($resource_roles, $user_roles).name permissions let $resource = (select resource name = "plan a"), $resource_roles = (select expand(out('isoftype').in('oftype')) $parent.$resource), $user = (select user name = "edi"), $user_roles = (select expand(out('hasarole')) $parent.$user) 

Comments
Post a Comment