Gremlin,结合两个查询并加入数据

Gremlin, combine two queries and join data

我在查询以下情况时遇到问题:

     +--------------------hasManager-------------------+
     |                         |                       |
     |           property:isPersonalMngr=true (bool)   |
     |                                                 v
[ Employee ]-- hasShift -->[ Shift ]-- hasManager -->[ Manager ]
                 |           |           |
                 |           |       property:isPersonalMngr=false (bool)
                 |           |
                 |     property:name (text)
                 |             
         property:baseShift (bool)

对于管理班次并且也可以是员工的个人经理的经理 'John',我想要 return 他管理的所有员工以及每个员工的班次列表。每个员工都有一个 'baseShift'(比如:'night' / 'day')和一个排班('wed123')

例如:

[ 'Employee1', [ 'night', 'wed123', 'sat123' ]]
[ 'Employee2', [ 'day', 'mon123', 'tue123' ]]

对于轮班员工,我有这个:

g.V('John').in('hasManager').in('hasShift').hasLabel('Employee')

对于个人管理我有这个:

g.V('John').in('hasManager').hasLabel('Employee')

如何组合这两者并在列表中添加班次的名称 属性?

谢谢。

为了对此进行测试,我创建了下图。希望这符合您上面的数据模型:

g.addV('Manager').property(id,'John').as('john').
    addV('Manager').property(id,'Terry').as('terry').
    addV('Manager').property(id,'Sally').as('sally').
    addV('Employee').property(id,'Tom').as('tom').
    addV('Employee').property(id,'Tim').as('tim').
    addV('Employee').property(id,'Lisa').as('lisa').
    addV('Employee').property(id,'Sue').as('sue').
    addV('Employee').property(id,'Chris').as('chris').
    addV('Employee').property(id,'Bob').as('bob').
    addV('Shift').property('name','mon123').as('mon123').
    addV('Shift').property('name','tues123').as('tues123').
    addV('Shift').property('name','sat123').as('sat123').
    addV('Shift').property('name','wed123').as('wed123').
    addE('hasManager').from('tom').to('john').property('isPersonalMngr',true).
    addE('hasManager').from('tim').to('john').property('isPersonalMngr',true).
    addE('hasManager').from('lisa').to('terry').property('isPersonalMngr',true).
    addE('hasManager').from('sue').to('terry').property('isPersonalMngr',true).
    addE('hasManager').from('chris').to('sally').property('isPersonalMngr',true).
    addE('hasManager').from('bob').to('sally').property('isPersonalMngr',true).
    addE('hasShift').from('tom').to('mon123').property('baseShift','day').
    addE('hasShift').from('tim').to('tues123').property('baseShift','night').
    addE('hasShift').from('lisa').to('wed123').property('baseShift','night').
    addE('hasShift').from('sue').to('sat123').property('baseShift','night').
    addE('hasShift').from('chris').to('wed123').property('baseShift','day').
    addE('hasShift').from('bob').to('sat123').property('baseShift','day').
    addE('hasShift').from('bob').to('mon123').property('baseShift','day').
    addE('hasShift').from('tim').to('wed123').property('baseShift','day').
    addE('hasManager').from('mon123').to('terry').property('isPersonalMngr',false).
    addE('hasManager').from('tues123').to('sally').property('isPersonalMngr',false).
    addE('hasManager').from('wed123').to('john').property('isPersonalMngr',false).
    addE('hasManager').from('sat123').to('terry').property('isPersonalMngr',false)

由此,以下查询会生成您要查找的格式的输出:

gremlin> g.V('John').
    union(
        inE('hasManager').has('isPersonalMngr',true).outV(),
        inE('hasManager').has('isPersonalMngr',false).outV().in('hasShift')).
    dedup().
    map(union(id(),out('hasShift').values('name').fold()).fold())
==>[Tom,[mon123]]
==>[Tim,[tues123,wed123]]
==>[Lisa,[wed123]]
==>[Chris,[wed123]]

关于您的数据模型的说明 - 您可以通过为 hasManager 设置两种不同类型的边来简化事情,这样就不需要在这些边上使用布尔值 属性。相反,你可以有 hasOrgManagerhasShiftManager 边,这样就不需要在遍历这些边时进行 属性 检查。