我有一个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兼容的商店上工作。