Как в Gremlin перенаправить все ребра, входящие в одну вершину, для соединения с другой вершиной?

Я использую Neptune в качестве своей графической базы данных.

Допустим, у меня есть главная вершина «А», и я хочу перенаправить все соединения, направленные к «А», в новую главную вершину «В». Я знаю, что все ребра, входящие в основную вершину, помечены как «master_edge».

В настоящее время у меня есть смесь кода python и gremlin, мне интересно, есть ли способ повысить производительность, сделав это исключительно в гремлине?

vertices_on_deck = g.V(old_master).inE().outV().toList()
          for i, current_vertex in enumerate(vertices_on_deck): 
            if i == 0:
                t = g.addE('master_edge').from_(__.V(current_vertex.id)).to(__.V(new_master))
            else: 
                t.addE('master_edge').from_(__.V(current_vertex.id)).to(__.V(new_master))
          t.iterate()
          g.V(old_master).drop().iterate()

person dl8    schedule 22.07.2019    source источник


Ответы (1)


Вы можете объединить все запросы в один:

g.V(old_master).as('oldMaster')
   .inE().outV().addE('master_edge').to(__.V(new_master))
   .select('oldMaster').drop().iterate()
person noam621    schedule 23.07.2019
comment
Хм, я обнаружил пограничный случай, когда вершины могут быть уже подключены к новому мастеру, и это создаст два ребра между вершиной и новым мастером. Есть ли способ добавить ребра только в том случае, если эта метка ребра еще не существует между вершиной и новой главной вершиной? - person dl8; 24.07.2019
comment
Вы можете использовать шаг объединения. gV(old_master).as('oldMaster') .inE().outV(). объединить (out('master_edge').hasId(old_master), .addE('master_edge').to(__.V(new_master))) .select('oldMaster').drop().iterate() - person noam621; 25.07.2019