Gremlin查询以选择实体中的通用属性

时间:2019-10-23 13:43:58

标签: gremlin

想使用gremlin获取选定的实体列

Entity1 - Employee has id, name, out_address, out_department attributes
Entity2 - Department has id, name, in_Employee attributes 
Entity3 - Address has id, street, city. state, in_address attributes

在普通SQL中,使用别名非常简单

Select emp.id, emp.name, dept.id, dept.name, address.id address.street, address.city, address.state
From Employee emp
INNER JOIN Department ON dept JOIN dept.id = emp.id
INNER JOIN Address ON address JOIN address.id = emp.id
where emp.id = "<some condition here>"

在格林姆林堡尝试相同的事情

g.V().has('Employee', 'id','<some condition here>').out('department').values('id', 'name', 'street', 'city')

但是我们获得的价值是部门的ID。

我是Gremlin的新手。你能帮忙吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您必须将Gremlin视为过滤器和转换的管道,所以当您这样做时:

g.V().has('Employee', 'id','<some condition here>').
  out('department').
  values('id', 'name', 'street', 'city')

首先获取“员工”顶点,然后遍历out()即可将“员工”顶点转换为其相关的“部门”顶点。此时,values(...)然后将“部门”的顶点转换为每个“部门”顶点的属性值”。

因此,从转换的角度出发,一种获得所需内容的方法是使用project()

g.V().has('Employee', 'id','<some condition here>').
  project('employeeName', 'employeeId', 'dept', 'addresses').
    by('name').
    by('id').
    by(out('department').elementMap()).
    by(out('address').elementMap().fold())

您从与以前相同的“员工”顶点开始,并使用project()将其转换为具有指定键的Map。每个密钥的值由以下by()调制器定义。因此,对于by('name'),我们是说要转换“雇员”顶点以获取“名称”属性值,并将其分配给“ employeeName”键。我们对by('id')和“ employeeId”键进行相同的操作。然后,对于与“部门”相关联的by(),我们从“员工”顶点开始,在“部门”边缘遍历,并使用Map步骤将该顶点转换为elementMap()(刚刚在3.4.4中可用-但您可以使用valueMap()或任何想要在“ dept”键中包含数据的转换)。最后,对于最后一个by(),我们所做的与“部门”相同,但请注意,我假设您有一个雇员多个地址,并在末尾添加了fold(),以将地址流减少到List作为“地址”键。