[英]Create a group vertex for each group, and create outgoing edges to the group vertices
我有一個 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]]}
我如何:對於每個組,創建一個頂點,該頂點的出邊到該組中的所有頂點,並將新的組頂點屬性設置為相同
例如,對於上面的例子,我會創建兩個新的頂點。 Group Vertex 1 的 'favorite_brand' 為 adidas,'favorite_color' 為藍色,並且有兩個出邊到兩個頂點 123 和 456。
組頂點 2 相同
gremlin 中有沒有一種方法可以執行此查詢,或者我是否必須將返回的 hashmap 存儲在變量中,並在我的 lambda 中進行循環以創建新頂點? 我熟悉 addV 步驟,但如何遍歷 hashmap 中的每個元素然后訪問列表值? 謝謝!
我查看了 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 的商店。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.