为每个组创建一个组顶点,并创建到组顶点的外向边

  • 本文关键字:顶点 创建 一个 gremlin
  • 更新时间 :
  • 英文 :


我有一个gremlin查询,它根据两个属性对顶点进行分组

g.V().hasLabel("PERSON").
group().
by(values('favorite_brand', 'favorite_color').fold()).
next()

返回映射到组

中顶点列表的每个组的列表。
1   {('adidas', 'blue'): [v[123], v[456]]}
2   {('nike', 'red'): [v[789]]}

我如何:为每个组创建一个顶点与该组中所有顶点的外出边,并将新组顶点属性设置为相同

对于上面的例子,我将创建两个新顶点。组顶点1将"favorite_brand"设置为adidas,"favorite_color"设置为blue,并且将有两条向外的边连接两个顶点123和456。

相同的组顶点2

是否有一种方法在gremlin携带这个查询,或者我必须存储返回的哈希映射在一个变量和循环在我的lambda创建新的顶点?我熟悉addV步骤,但我将如何遍历哈希映射中的每个元素,然后访问列表值?谢谢!

我看了tinkerpop的官方文档来理解组步骤,但是没有找到足够的关于如何迭代结果和执行操作的信息

没有您的数据,下面的答案是使用航线数据集构建的。初始组可以使用:

g.V().hasId('3','8','12','13','14').
group().
by(values('region', 'country').fold()).
unfold()

收益率

1   {('US-CA', 'US'): [v[13]]}
2   {('US-NY', 'US'): [v[12], v[14]]}
3   {('US-TX', 'US'): [v[3], v[8]]}

从那里,我们可以构建一个查询来展开组,同时创建新的节点和边。

g.V().hasId('3','8','12','13','14').
group().
by(values('region', 'country').fold()).
unfold().as('grp').
addV('group').as('new-node').
property('region',select(keys).limit(local,1)).
property('country',select(keys).tail(local)).
sideEffect(select('grp').select(values).unfold().addE('new-edge').from('new-node'))

显示了我们创建的节点,但也将创建sideEffect内部的边。

1   v[26c2d653-5e9c-3ec9-0854-6ed2a212c63b]
2   v[80c2d653-5e9c-b838-063c-82f6d21cd6e5]
3   v[42c2d653-5e9d-31c7-2c02-c7bf72fe8e38]

我们可以使用下面的查询来验证一切是否正常。

g.V().hasLabel('group').out().path().by(valueMap()).by(id())

返回

1   path[{'region': ['US-CA'], 'country': ['US']}, 13]
2   path[{'region': ['US-NY'], 'country': ['US']}, 12]
3   path[{'region': ['US-NY'], 'country': ['US']}, 14]
4   path[{'region': ['US-TX'], 'country': ['US']}, 3]
5   path[{'region': ['US-TX'], 'country': ['US']}, 8]

我使用Amazon Neptune来构建这个答案,但它应该可以在其他TinkerPop兼容的商店上工作。

最新更新