[英]Gremlin - Update or insert multiple vertices
我正在嘗試使用以下 gremlin 查詢來替換現有頂點(如果它們存在),但行V(__.select('id')).drop()
一直失敗,因為__.select('id')
沒有返回該 id線。
vertices = [
{"id":1, "label": "person", "first_name":"bob","age":25,"height": 177},
{"id":2, "label": "person", "first_name":"joe","surname":"bloggs", "age": 32}
]
graph_traversal.inject(vertices).unfold().as_('entity'). \
V(__.select('id')).drop(). \
addV(__.select('label')).property(T.id, __.select('id')).as_('vertex'). \
sideEffect(__.select('entity').unfold().as_('kv').select('vertex'). \
property(
__.select('kv').by(Column.keys),
__.select('kv').by(Column.values)
)
)
這是一種處理方法,但它需要您對Map
數據List
進行一些前端處理,以提取“id”值,以便它們可以直接傳遞給gV()
。
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> data = [
......1> ["id":1, "label": "person", "first_name":"bob","age":25,"height": 177],
......2> ["id":2, "label": "person", "first_name":"joe","surname":"bloggs", "age": 32]
......3> ]
==>[id:1,label:person,first_name:bob,age:25,height:177]
==>[id:2,label:person,first_name:joe,surname:bloggs,age:32]
gremlin> g.V(data.collect{it.id}).
......1> sideEffect(drop()).
......2> fold().
......3> constant(data).
......4> unfold().as('properties').
......5> addV(select('label')).property(T.id, select('id')).as('vertex').
......6> sideEffect(select('properties').
......7> unfold().as('kv').
......8> where(select(keys).is(without('id','label'))).
......9> select('vertex').
.....10> property(select('kv').by(keys), select('kv').by(values)))
==>v[1]
==>v[2]
gremlin> g.V(1,2).elementMap()
==>[id:1,label:person,first_name:bob,age:25,height:177]
==>[id:2,label:person,surname:bloggs,first_name:joe,age:32]
這里需要特別注意的是使用fold()
來將刪除的頂點遍歷器的 stream 減少為單個遍歷器(即這些頂點的List
),然后讓我們用單個“數據”實例替換它以在使用Map
創建Vertex
的常見方式。 請注意,我添加了where()
來忽略“id”和“label”鍵,因為我認為您不希望將這些值作為頂點屬性重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.