联合步骤不适用于多个元素
Union step does not work with multiple elements
以下查询 return 是一个带有 "injected" 属性 的用户映射,名为 "questions",它在 g.V().has()
return 时按预期工作是单个用户,但当 return 是多个用户时则不是:
return g.V().has("user", "userId", 1)
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values));
有效,但是当我将第一行更改为 return 多个用户时:
g.V().hasLabel("user").union(....
我完成了调用 .toList()
的查询,因此我希望以与处理单个用户相同的方式获得所有用户的列表,但我仍然得到一个用户。
如何让我的查询同时适用于多个用户或单个用户?
使用 Gremlin 时,您必须从流的角度考虑。该流包含 traversers,它遍历您编写的步骤。在您的情况下,您的初始测试为:
g.V().has("user", "userId", 1)
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values))
你有一个遍历器(即 V().has("user", "userId", 1)
产生一个用户)流向 union()
并被拆分,以便它同时流向 valueMap()
和 project()
产生 Map
个实例。您现在有两个遍历器,它们被展开为一个流并组合在一起成为一个最终的 Map
遍历器。
考虑到这一点,当您执行 hasLabel("user")
时会发生什么变化?好吧,你现在有不止一个起始遍历器,这意味着当你到达 union()
时,你将为每个用户生成两个遍历器。它们每个都将被 unfold()
扁平化为流,然后它们将相互覆盖(因为它们具有相同的密钥)以产生一个最终的 Map
。
你真的想执行你的 union()
并在每个初始 "user" 顶点遍历器上进行一次操作。您可以告诉 Gremlin 使用 map()
:
g.V().has("user", "userId", 1)
.map(
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values))
)
最后,您可以将最终的 by()
调制器简化为:
g.V().has("user", "userId", 1)
.map(
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(keys)
.by(values)
)
以下查询 return 是一个带有 "injected" 属性 的用户映射,名为 "questions",它在 g.V().has()
return 时按预期工作是单个用户,但当 return 是多个用户时则不是:
return g.V().has("user", "userId", 1)
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values));
有效,但是当我将第一行更改为 return 多个用户时:
g.V().hasLabel("user").union(....
我完成了调用 .toList()
的查询,因此我希望以与处理单个用户相同的方式获得所有用户的列表,但我仍然得到一个用户。
如何让我的查询同时适用于多个用户或单个用户?
使用 Gremlin 时,您必须从流的角度考虑。该流包含 traversers,它遍历您编写的步骤。在您的情况下,您的初始测试为:
g.V().has("user", "userId", 1)
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values))
你有一个遍历器(即 V().has("user", "userId", 1)
产生一个用户)流向 union()
并被拆分,以便它同时流向 valueMap()
和 project()
产生 Map
个实例。您现在有两个遍历器,它们被展开为一个流并组合在一起成为一个最终的 Map
遍历器。
考虑到这一点,当您执行 hasLabel("user")
时会发生什么变化?好吧,你现在有不止一个起始遍历器,这意味着当你到达 union()
时,你将为每个用户生成两个遍历器。它们每个都将被 unfold()
扁平化为流,然后它们将相互覆盖(因为它们具有相同的密钥)以产生一个最终的 Map
。
你真的想执行你的 union()
并在每个初始 "user" 顶点遍历器上进行一次操作。您可以告诉 Gremlin 使用 map()
:
g.V().has("user", "userId", 1)
.map(
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(__.select(column.keys))
.by(__.select(column.values))
)
最后,您可以将最终的 by()
调制器简化为:
g.V().has("user", "userId", 1)
.map(
.union(
__.valueMap().by(__.unfold()),
__.project('questions').by(
__.outE('response').valueMap().by(__.unfold()).fold()
)
)
.unfold()
.group()
.by(keys)
.by(values)
)