Thanks! On Wed, Aug 31, 2011 at 6:50 PM, Marko Rodriguez <[email protected]>wrote:
> 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 > _______________________________________________ Neo4j mailing list [email protected] https://lists.neo4j.org/mailman/listinfo/user

