想使用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的新手。你能帮忙吗?
谢谢
答案 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
作为“地址”键。