Hey,

One more thing. 

WARNING: If your transaction mode is AUTOMATIC, then there will be one 
transaction for each mutation !! tx.begin/tx.commit/tx.finish

gremlin> g.transactionMode
==>AUTOMATIC

You can use a transaction manager if you plan this query to iterate over lots 
of vertices and do lots of mutations:
        https://github.com/tinkerpop/blueprints/wiki/Graph-Transactions-Helpers

Thus, your mutating traversal would be:

        manager = TransactionalGraphHelper.createCommitManager(g, 1000);
        g.V.outE('foo').sideEffect{g.addEdge(it.outVertex,g.v('B'),'foo'); 
g.removeEdge(it); manager.incrCounter()}
        manager.close();

Hope that helps -- and doesn't confuse :).

Marko.
http://markorodriguez.com

P.S. Gremlin 1.3 will make it much more natural to do batch transactions. 
TransactionGraphs (like Neo4j) will have a "setTransactionBuffer(int 
bufferSize)" method so you don't need to create this CommitManager object. 
Anywho. Thats that. See ya.

On Aug 31, 2011, at 7:38 PM, Marko Rodriguez wrote:

> Hi,
> 
> I did you example over TinkerGraph as vertex IDs are Strings and thus, easy 
> to build your graph with.
> 
> ~$ gremlin
>         \,,,/
>         (o o)
> -----oOOo-(_)-oOOo-----
> gremlin> g = new TinkerGraph() 
> ==>tinkergraph[vertices:0 edges:0]
> gremlin> g.addVertex('A'); g.addVertex('B'); g.addVertex('C'); 
> g.addVertex('D'); g.addVertex('E');
> ==>v[E]
> gremlin> g.addEdge(g.v('C'),g.v('A'),'foo'); 
> g.addEdge(g.v('D'),g.v('A'),'foo'); g.addEdge(g.v('E'),g.v('A'),'bar')        
>                                          
> ==>e[2][E-bar->A]
> gremlin> g.V
> ==>v[D]
> ==>v[E]
> ==>v[A]
> ==>v[B]
> ==>v[C]
> gremlin> g.E
> ==>e[2][E-bar->A]
> ==>e[1][D-foo->A]
> ==>e[0][C-foo->A]
> 
> So, you have your 5 vertices and 3 edges. Next, here is your mutating 
> traversal:
> 
> gremlin> g.V.outE('foo').sideEffect{g.addEdge(it.outVertex,g.v('B'),'foo'); 
> g.removeEdge(it)}
> ==>e[1][D-foo->A]
> ==>e[0][C-foo->A]
> 
> And now your edges are as you wanted them.
> 
> gremlin> g.E
> ==>e[3][D-foo->B]
> ==>e[2][E-bar->A]
> ==>e[4][C-foo->B]
> 
> So again, your traversal is:
>       
>       g.V.outE('foo').sideEffect{g.addEdge(it.outVertex,g.v('B'),'foo'); 
> g.removeEdge(it)}
> 
> Here is what the traversal says step-by-step:
> 
>       g.V : iterate through all vertices
>       outE('foo') : iterate through their the outgoing 'foo' labeled edges
>       sideEffect{} : yield a sideEffect (mutate state)
>               g.addEdge(it.outVertex,g.v('B'),'foo'): add a new edge from the 
> vertex (e.g. C,D,E -- it.outVertex) to vertex B with label 'foo'.             
>   
>               g.removeEdge(it) : remove the current edge (it)
>               
> 
> Note that its more optimal to do:
> 
>       v = g.v('B'); 
> g.V.outE('foo').sideEffect{g.addEdge(it.outVertex,v,'foo'); g.removeEdge(it)}
> 
> Also, vertex IDs are not Strings in Neo4j, but longs. Hopefully you can do 
> what you need from here.
> 
> Good luck,
> Marko.
> 
> http://markorodriguez.com
> 
> On Aug 31, 2011, at 6:17 PM, Nuo Yan wrote:
> 
>> I want to update the ending node for all relationships that are type :foo
>> coming into node A to node B.
>> 
>> For example, for all relationships that are type :foo coming into node A
>> (node A as the end node), no matter where their starting node is, I want
>> them to set the end node to node B.
>> 
>> Node C --:foo--> Node A
>> Node D --:foo--> Node A
>> Node E --:bar--> Node A
>> 
>> would become:
>> 
>> Node C --:foo--> Node B
>> Node D --:foo -> Node B
>> Node E --:bar--> Node A
>> 
>> On Wed, Aug 31, 2011 at 5:00 PM, Marko Rodriguez <okramma...@gmail.com>wrote:
>> 
>>> Hi,
>>> 
>>> If you tell me in English what you want to do, I can give you the Gremlin
>>> query. With Gremlin, you can traverse and update in a single query so
>>> perhaps it will meet your needs.
>>> 
>>> Marko.
>>> 
>>> http://markorodriguez.com
>>> 
>>> On Aug 31, 2011, at 5:13 PM, Nuo Yan wrote:
>>> 
>>>> I looked through the REST APIs and didn't see an endpoint to move
>>>> relationships. Is such operation possible? For example, given a set of
>>>> relationships all end in one node, I want to send a bulk request to
>>> update
>>>> their end nodes to another node.
>>>> 
>>>> If there is no REST API for updating/moving relationship, what is the
>>> best
>>>> way to do this? Can gremlin do it easily? Or do I have to delete all of
>>> the
>>>> relationships and create new ones to the new end node?
>>>> 
>>>> Thanks,
>>>> Nuo
>>>> _______________________________________________
>>>> Neo4j mailing list
>>>> User@lists.neo4j.org
>>>> https://lists.neo4j.org/mailman/listinfo/user
>>> 
>>> _______________________________________________
>>> Neo4j mailing list
>>> User@lists.neo4j.org
>>> https://lists.neo4j.org/mailman/listinfo/user
>>> 
>> _______________________________________________
>> Neo4j mailing list
>> User@lists.neo4j.org
>> https://lists.neo4j.org/mailman/listinfo/user
> 

_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to