因此从图中我想保存formula vertex
修改过的user vertex
的早期版本。
这是修改公式后我想做的事情
formula vertex
的值,并将最近的previos_value
的{{1}}边添加到先前的formula vertex
formula vertex
的{{1}}边添加到上一个modified
user vertex
的所有传出和传入边缘转移到最新的formula vertex
答案 0 :(得分:2)
这是完成工作的简单辅助方法:
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()
}
在实践中,它看起来像这样:
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]]