////
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
////
[[edge-move]]
== Moving an Edge

image:gremlin-edge.png[width=145]

Aside from their properties, edges are immutable structures where the label and the related in and out vertices
cannot be modified. To "move" an edge from one vertex to another, it requires that the edge be dropped and a new edge
be created with the same properties and label. It is possible to simulate this "move" in a single traversal as
follows:

[gremlin-groovy,modern]
----
g.V().has('name','marko').
  outE().inV().
  path().by('name').by(elementMap())
----

The "marko" vertex contains a "knows" edge to the "vadas" vertex. The following code shows how to "move" that edge to
the "peter" vertex in a single traversal:

[gremlin-groovy,modern]
----
g.V().has('name','marko').as('a').
  outE('knows').as('e1').filter(inV().has('name','vadas')).       <1>
  V().has('name','peter').
  addE('knows').from('a').as('e2').                               <2>
  sideEffect(select('e1').properties().
             unfold().as('p').
             select('e2').
             property(select('p').key(), select('p').value())).   <3>
  select('e1').drop()                                             <4>
g.V().has('name','marko').
  outE().inV().
  path().by('name').by(elementMap())
----

<1> Find the edge to "move" and label that as "e1". It will be necessary to reference this later to get the edge
properties to transfer to the new "moved" edge.
<2> Add the "moved" edge and label it as "e2".
<3> Use a `sideEffect()` to transfer the properties from "e1" to "e2".
<4> Use `drop()` to get rid of the old edge at "e1" now that the new "e2" edge is in place.