sql - OrientDB Select on two related vertex -


i have scenario shown below enter image description here,

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.

tweaked graph

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

Popular posts from this blog

1111. appearing after print sequence - php -

node.js - Express and Redis - If session exists for this user, don't allow access -

excel - I can't get the attachement of the email PHP -