Apache TinkerPop 的 Gremlin 语言中是否有等效的左连接?

Is there an equivalent of a left join in Apache TinkerPop's Gremlin language?

我是 Gremlin 和 Apache TinkerPop 的新手,所以希望这应该很简单。我有一个图表,其中一个角色关系是在一个带有人标签的顶点和另一个带有权限标签的顶点之间建立的。边缘具有反映角色的标签,例如管理、阅读等

权限顶点也是嵌套的,因此在owns之间有边。在权限模型中,这应该用于应用隐式权限,因此如果您与顶级权限具有管理员关系,它也应该适用于该权限拥有的所有权限。

设置基本设置的一些示例:-


g.addV('person').property('name', 'dan').as('dan')
    .addV('person').property('name', 'mike').as('mike')
    .addV('person').property('name', 'saikiran').as('saikiran')
    .addV('authority').property('name', 'My Office Global').as('mo_global')
    .addV('authority').property('name', 'My Office EU').as('mo_eu')
    .addV('authority').property('name', 'My Office ANZ').as('mo_anz')
    .addV('authority').property('name', 'My Office UK').as('mo_uk')
    .addV('authority').property('name', 'My Office Germany').as('mo_germany')
    .addE('owns').from('mo_global').to('mo_eu')
    .addE('owns').from('mo_global').to('mo_anz')
    .addE('owns').from('mo_eu').to('mo_uk')
    .addE('owns').from('mo_eu').to('mo_germany')
    .addE('administers').from('dan').to('mo_eu')
    .addE('reads').from('dan').to('mo_global')
    .addE('administers').from('mike').to('mo_uk')
    .addE('reads').from('mike').to('mo_eu')
    .addE('administers').from('saikiran').to('mo_anz')

据此,我想创建一个查询,以获取与用户具有管理关系的所有权限及其子项;我目前的查询如下:-

g.V().hasLabel('person').as('person')
    .out('administers').as('admin_role')
    .repeat(out('owns').as('auth_child'))
    .emit()
    .select('person').values('name').as('person_name')
    .select('admin_role').values('name').as('explicit_admin_role')
    .select('auth_child').values('name').as('implicit_admin_role')
    .select('person_name', 'explicit_admin_role', 'implicit_admin_role')

我遇到的问题是,这适用于有权限子级的人,但我失去了那些作为底层权限管理员的人。

来自 SQL 背景,我想使 repeat(out..) 成为某种左连接,但我不确定该由谁来做,或者如果可能的话,在格林姆林?

提前致谢。

好的,使用 projects 完成了我需要完成的工作:-

g.V().hasLabel('person').as('person')
    .project('user', 'explicit', 'implicit')
    .by('name')
    .by(out('administers').values("name"))
    .by(out('administers')
        .repeat(out('owns').as('implicit'))
        .emit()
        .select('implicit').values('name')
        .fold())