Нам нужно создать оптимизированный запрос (или изменить структуру графика, а затем создать оптимизированный запрос), чтобы найти все группы пользователей с указанием идентификатора пользователя в качестве параметра.
пользователи принадлежат к 3 типам спецификаций ( называя их nSpecs): состояние, роль, отдел. Группы создаются как композиция nSpecs, условие OR между одним и тем же типом + условие AND между различными типами nspecs.
Примечания:
- Группы могут иметь расширенные nspecs, значит, если они имеют отдел ds3 и отношение имеет свойство extended true, это означает, что группа включает всех дочерних элементов ds3, которые являются ds2 и ds3.
- Группы также могут игнорировать некоторые типы nspecs, например, если группа не указывает state, он связан с состоянием root, подразумевая, что все состояния расширены.
вот список пользователей: список пользователей
ниже приведены отношения of nspecs
роли - это r1, r2, а роль root - это r0, состояния - s101, s1, s2, а состояние root - s0 - это d1 d2 d3 и dept Root - d0
dept d3 - родительский od d2 state s101 - родительский для s1 и s2 rest, все nspecs, у которых нет родителя, являются потомками своих соответствующих корней
ex. Группа 1 - это состояние в [MH] и роль в [SM], а также отдел в любых отношениях, все люди с состоянием MH, ролью SM и любым отделом.
ex. Группа 8 может быть состоянием в [INDIA-extended], а роль в [SM, AM] и отдел в [DS1] означает всех, у кого состояние является n-м потомком ИНДИИ, потому что отношение имеет расширенный набор свойств, роль в любом из SM и AM и отдел в DS1.
графическое представление
ниже приведен сценарий для создания графа.
// creating nspec-roots
CREATE (r0:NSpec { name: 'RoleRoot', tenant:'5555_omtest1', type: 'role', ntype:'role' })
CREATE (d0:NSpec { name: 'DeptRoot', tenant:'5555_omtest1', type: 'department', ntype:'department' })
CREATE (s0:NSpec { name: 'StateRoot', tenant:'5555_omtest1', type: 'state', ntype:'n1' })
// creating nspecs
CREATE (r1:NSpec { tenant:'5555_omtest1' , name: 'State Manager', type: 'role', ntype:'role' })
CREATE (r2:NSpec { tenant:'5555_omtest1' , name: 'Area Manager', type: 'role', ntype:'role' })
CREATE (d1:NSpec { tenant:'5555_omtest1' , name: 'DS1', type: 'department', ntype:'department' })
CREATE (d2:NSpec { tenant:'5555_omtest1' , name: 'DS2', type: 'department', ntype:'department' })
CREATE (d3:NSpec { tenant:'5555_omtest1' , name: 'DS3', type: 'department', ntype:'department' })
CREATE (s101:NSpec { tenant:'5555_omtest1' , name: 'INDIA', type: 'state' , ntype:'n1'})
CREATE (s1:NSpec { tenant:'5555_omtest1' , name: 'MH', type: 'state' , ntype:'n1'})
CREATE (s2:NSpec { tenant:'5555_omtest1' , name: 'AP', type: 'state' , ntype:'n1'})
// creating nspec-hrcy
CREATE (r0)-[:parent_of]->(r1)
CREATE (r0)-[:parent_of]->(r2)
CREATE (d0)-[:parent_of]->(d1)
CREATE (d0)-[:parent_of]->(d3)
CREATE (d3)-[:parent_of]->(d2)
CREATE (s0)-[:parent_of]->(s101)
CREATE (s101)-[:parent_of]->(s1)
CREATE (s101)-[:parent_of]->(s2)
// creating users
CREATE (u1:User {employerGID:'U1', name:'U1, sm mh ds1', tenant:'5555_omtest1'} )
CREATE (u2:User {employerGID:'U2', name:'U2, sm ap ds1', tenant:'5555_omtest1'} )
CREATE (u3:User {employerGID:'U3', name:'U3, sm mh ds2', tenant:'5555_omtest1'} )
CREATE (u4:User {employerGID:'U4', name:'U4, sm ap ds2', tenant:'5555_omtest1'} )
CREATE (u5:User {employerGID:'U5', name:'U5, am mh ds1', tenant:'5555_omtest1'} )
CREATE (u6:User {employerGID:'U6', name:'U6, am mh ds2', tenant:'5555_omtest1'} )
CREATE (u7:User {employerGID:'U7', name:'U7, am mh ds3', tenant:'5555_omtest1'} )
CREATE (u8:User {employerGID:'U8', name:'U8, am ap ds2', tenant:'5555_omtest1'} )
CREATE (u9:User {employerGID:'U9', name:'U9, am ap ds3', tenant:'5555_omtest1'} )
CREATE (u11:User {employerGID:'U11', name:'U11, am ap ds1', tenant:'5555_omtest1'} )
// creating relations for users
CREATE (u1)-[:belongs_to]->(d1)
CREATE (u2)-[:belongs_to]->(d1)
CREATE (u3)-[:belongs_to]->(d2)
CREATE (u4)-[:belongs_to]->(d2)
CREATE (u5)-[:belongs_to]->(d1)
CREATE (u6)-[:belongs_to]->(d2)
CREATE (u7)-[:belongs_to]->(d3)
CREATE (u8)-[:belongs_to]->(d2)
CREATE (u9)-[:belongs_to]->(d3)
CREATE (u11)-[:belongs_to]->(d1)
CREATE (u1)-[:belongs_to]->(r1)
CREATE (u2)-[:belongs_to]->(r1)
CREATE (u3)-[:belongs_to]->(r1)
CREATE (u4)-[:belongs_to]->(r1)
CREATE (u5)-[:belongs_to]->(r2)
CREATE (u6)-[:belongs_to]->(r2)
CREATE (u7)-[:belongs_to]->(r2)
CREATE (u8)-[:belongs_to]->(r2)
CREATE (u9)-[:belongs_to]->(r2)
CREATE (u11)-[:belongs_to]->(r2)
CREATE (u1)-[:belongs_to]->(s1)
CREATE (u2)-[:belongs_to]->(s2)
CREATE (u3)-[:belongs_to]->(s1)
CREATE (u4)-[:belongs_to]->(s2)
CREATE (u5)-[:belongs_to]->(s1)
CREATE (u6)-[:belongs_to]->(s1)
CREATE (u7)-[:belongs_to]->(s1)
CREATE (u8)-[:belongs_to]->(s2)
CREATE (u9)-[:belongs_to]->(s2)
CREATE (u11)-[:belongs_to]->(s2)
// creating groups
// creating group relations
CREATE (g100:Group {id:'g100',name:'Company Wide',tenant:'5555_omtest1'} )
CREATE (g100)-[:contains {extended:true}]->(r0)
CREATE (g100)-[:contains {extended:true}]->(s0)
CREATE (g100)-[:contains {extended:true}]->(d0)
CREATE (g1:Group {id:'g1',name:'MH SM all dept',tenant:'5555_omtest1'} )
CREATE (g1)-[:contains {extended:false}]->(r1)
CREATE (g1)-[:contains {extended:false}]->(s1)
CREATE (g1)-[:contains {extended:true}]->(d0)
CREATE (g2:Group {id:'g2',name:'AP SM all dept',tenant:'5555_omtest1'} )
CREATE (g2)-[:contains {extended:false}]->(r1)
CREATE (g2)-[:contains {extended:false}]->(s2)
CREATE (g2)-[:contains {extended:true}]->(d0)
CREATE (g3:Group {id:'g3',name:'MH AM DS3_extended',tenant:'5555_omtest1'} )
CREATE (g3)-[:contains {extended:false}]->(r2)
CREATE (g3)-[:contains {extended:false}]->(s1)
CREATE (g3)-[:contains {extended:true}]->(d3)
CREATE (g4:Group {id:'g4',name:'MH AM g4',tenant:'5555_omtest1'} )
CREATE (g4)-[:contains {extended:false}]->(r2)
CREATE (g4)-[:contains {extended:false}]->(s1)
CREATE (g5:Group {id:'g5',name:'MH AM ds2',tenant:'5555_omtest1'} )
CREATE (g5)-[:contains {extended:false}]->(r2)
CREATE (g5)-[:contains {extended:false}]->(s1)
CREATE (g5)-[:contains {extended:true}]->(d2)
// get groups expected
// u1, u3 -> g1, g100
// u2, u4 -> g2, g100
// u5 -> g100, g4
// u6 -> g3, g100, g4 , g5
// u7 -> g3, g100, g4
// u8 -> g100
// u9 -> g100
// u11 -> g100