因此从图中我想保存formula vertex
修改过的user vertex
的早期版本。
这是修改公式后我想做的事情
- 克隆先前的
formula vertex
的值,并将最近的previos_value
的{{1}}边添加到先前的formula vertex
- 将
formula vertex
的{{1}}边添加到上一个modified
- 将上一个
user vertex
的所有传出和传入边缘转移到最新的formula vertex
这是完成工作的简单辅助方法:
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",user)).
iterate()
}
在实践中,它看起来像这样:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6],standard]
gremlin>
gremlin> modify = { user,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:4,name:josh,age:32]]
==>[[lop,[id:6,name:peter,age:35]]