如何在 2 个带边的顶点之间插入一个顶点。 Azure Cosmos DB [小精灵 API]
how to insert a vertex in between 2 vertices with edge. Azure Cosmos DB [GREMLIN API]
所以从图中我想保存由 user vertex
.
修改的 formula vertex
的以前版本
如果公式被修改,我想做的事情是这样的
- 克隆
formula vertex
的前一个值,并从最新的 formula vertex
到前一个 formula vertex
添加一条 previos_value
边
- 从
user vertex
到前一个 formula vertex
添加一条 modified
边
- 将前一个
formula 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","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]]
所以从图中我想保存由 user vertex
.
formula vertex
的以前版本
如果公式被修改,我想做的事情是这样的
- 克隆
formula vertex
的前一个值,并从最新的formula vertex
到前一个formula vertex
添加一条 - 从
user vertex
到前一个formula vertex
添加一条 - 将前一个
formula vertex
的所有传出和传入边转移到最新的formula vertex
previos_value
边
modified
边
这将是完成这项工作的简单辅助方法:
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]]