Gremlin-更新或插入多个顶点

Gremlin-更新或插入多个顶点,gremlin,tinkerpop,gremlin-server,Gremlin,Tinkerpop,Gremlin Server,我正在尝试以下gremlin查询来替换现有顶点,如果它们存在,但行V(\uuuu.select('id'))。drop()一直失败,因为\uuuuu.select('id')不返回该行上的id vertices = [ {"id":1, "label": "person", "first_name":"bob","age":25,"height": 177}, {"id":2, "label": "person", "first_name":"joe","surname":"bl

我正在尝试以下gremlin查询来替换现有顶点,如果它们存在,但行
V(\uuuu.select('id'))。drop()
一直失败,因为
\uuuuu.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)
       )
   )

这里有一种方法,但它要求您对
映射的
列表
数据进行一些前端处理,以提取“id”值,以便直接将它们传递给
g.V()

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()
将丢弃的顶点遍历器流减少为单个遍历器(即,这些顶点的
列表
),然后让我们用单个“数据”实例替换它,以使用
映射
创建
顶点
的常见方式进行迭代。请注意,我添加了一个
where()
来忽略“id”和“label”键,因为我认为您不希望这些值作为顶点属性复制到中

这里有一种方法,但它要求您对
映射数据的
列表
进行一些前端处理,以提取“id”值,以便将它们直接传递给
g.V()

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()
将丢弃的顶点遍历器流减少为单个遍历器(即,这些顶点的
列表
),然后让我们用单个“数据”实例替换它,以使用
映射
创建
顶点
的常见方式进行迭代。请注意,我添加了一个
where()
来忽略“id”和“label”键,因为我认为您不希望这些值作为顶点属性复制到中