Gremlin - обновить или вставить несколько вершин - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь использовать следующий запрос gremlin, чтобы заменить существующие вершины, если они существуют, но строка V(__.select('id')).drop() продолжает сбой, потому что __.select('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)
       )
   )

1 Ответ

1 голос
/ 15 апреля 2020

Вот способ приблизиться к этому, но он требует, чтобы вы выполнили небольшую обработку переднего плана для ваших List из Map данных, чтобы извлечь значения "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() для уменьшения потока пропущенных пересечений вершин до одного проходчика (т. Е. List из этих вершин), который затем давайте заменим это на один экземпляр «данных» для итерации обычным способом для использования Map для создания Vertex. Обратите внимание, что я добавил where(), чтобы игнорировать ключи "id" и "label", поскольку я подумал, что вы не хотите, чтобы эти значения дублировались в качестве свойств вершин.

...