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 <[email protected]>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
>>>> [email protected]
>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>
>>> _______________________________________________
>>> Neo4j mailing list
>>> [email protected]
>>> https://lists.neo4j.org/mailman/listinfo/user
>>>
>> _______________________________________________
>> Neo4j mailing list
>> [email protected]
>> https://lists.neo4j.org/mailman/listinfo/user
>
_______________________________________________
Neo4j mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user