so from the diagram i would like to save previous versions of formula vertex
that is modified by user vertex
.
So here are the things that i want to do if a formula is modified
formula vertex
and add a previos_value
edge from the latest formula vertex
to the previous formula vertex
modified
edge from the user vertex
to the previous formula vertex
formula vertex
to the latest formula vertex
This would be a simple helper method to do the job:
modify = { user, product, version ->
g.V().has("software","name",product).as("s"). /* this would be your formula vertex */
valueMap().
by(unfold()).as("sm").
addV("software").as("ns"). /* create a new vertex */
sideEffect(select("sm").unfold().as("kv"). /* copy properties from the old vertex */
select("ns").
property(select("kv").by(keys),
select("kv").by(values))).
property("version",version). /* set version on the new vertex */
select("s").
sideEffect( /* transfer out-edges */
outE().as("e").
sideEffect(
select("ns").
addE(select("e").by(label)).
to(select("e").inV()).as("ne").
select("e").properties().as("p").
select("ne").
property(select("p").key(),
select("p").value())).
drop()).
sideEffect( /* transfer in-edges */
inE().as("e").
not(outV().where(eq("s"))). /* exclude self-referencing edges */
sideEffect(
select("ns").
addE(select("e").by(label)).
from(select("e").outV()).as("ne").
select("e").properties().as("p").
select("ne").
property(select("p").key(),
select("p").value())).
drop()).
select("ns").
addE("previous_value").to("s").inV(). /* add edges to previous version and user */
addE("modified").
from(V().has("person","name",user)).
iterate()
}
In practice it would look like this:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin>
gremlin> modify = { user, product, version ->
...
.....39> }
==>groovysh_evaluate$_run_closure1@7523d5a1
gremlin>
gremlin> modify("marko","lop","v2")
gremlin>
gremlin> g.V().has("name","lop").
......1> inE().outV().
......2> path().
......3> by(values("name","version").fold()).
......4> by(label).
......5> by(elementMap())
==>[[lop],previous_value,[id:13,label:software,name:lop,lang:java,version:v2]]
==>[[lop],modified,[id:1,label:person,name:marko,age:29]]
==>[[lop,v2],created,[id:1,label:person,name:marko,age:29]]
==>[[lop,v2],created,[id:4,label:person,name:josh,age:32]]
==>[[lop,v2],created,[id:6,label:person,name:peter,age:35]]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.