в neo4j, как найти все узлы, связанные с узлом: пользователю задан идентификатор пользователя в качестве параметра на графике, описанном ниже - PullRequest
0 голосов
/ 07 августа 2020

Нам нужно создать оптимизированный запрос (или изменить структуру графика, а затем создать оптимизированный запрос), чтобы найти все группы пользователей с указанием идентификатора пользователя в качестве параметра.

пользователи принадлежат к 3 типам спецификаций ( называя их nSpecs): состояние, роль, отдел. Группы создаются как композиция nSpecs, условие OR между одним и тем же типом + условие AND между различными типами nspecs.

Примечания:

  1. Группы могут иметь расширенные nspecs, значит, если они имеют отдел ds3 и отношение имеет свойство extended true, это означает, что группа включает всех дочерних элементов ds3, которые являются ds2 и ds3.
  2. Группы также могут игнорировать некоторые типы 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
  
...