如何在 TinkerPop 图中传播值



我将如何通过 TinkerPop 图"传播"一个值?即给定一个顶点上的属性值,我想将该值沿边"移动"到另一个顶点或一组顶点。

例如,给定这个包含 3 个顶点和 2 条连接它们的边的简单图形:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> a = g.addV('name','a','amount', 100).next()
==>v[0]
gremlin> b = g.addV('name','b','amount', 0).next()
==>v[3]
gremlin> c = g.addV('name','c','amount', 0).next()
==>v[6]
gremlin> a.addEdge('drain', b, 'factor', 0.5)
==>e[9][0-drain->3]
gremlin> b.addEdge('drain', c, 'factor', 0.1)
==>e[10][3-drain->6]
gremlin> 

我希望在此图上运行某种操作,以便将a中的amount复制到b乘以连接它们的边缘中的factor。 例如,b['金额'] 等于 50。然后进一步传播 c['amount'] 将等于 5。

理想情况下,我想知道一个语句,它可以一次性将值一直传播到链中,但也想知道一个可能将其传播到第一个相邻顶点的语句,然后在第二次调用时将其传播到下一个顶点,依此类推。

这是可以在Gremlin中完成的事情,还是我需要TinkerPop的其他部分?

我设法使用 Gremlin 麻袋做到这一点:

gremlin> g.withSack(a.value('amount')).
V(a).repeat(outE('drain').sack(mult).by('factor').
inV().property('amount', sack())).
until(__.outE('drain').count().is(0)).iterate()
gremlin> g.V().valueMap()
==>[amount:[100],name:[a]]
==>[amount:[50.0],name:[b]]
==>[amount:[5.00],name:[c]]

我将"麻袋值"初始化为顶点"a"中的"数量",并开始遍历,在我们乘法的"排水"边缘上迭代遍历(即mult)在"排水"边缘上的"因子"属性的麻袋中的值。然后,袋子通过property()步长分配给下一个顶点。

请注意,您可以使用适当的循环语义来控制"排水"(即您想在链上走多远repeat。现在它使用until()"不再有传出的边缘"。但您也可以在一步之遥处终止,如下所示:

gremlin> g.withSack(a.value('amount')).
V(a).repeat(outE('drain').sack(mult).by('factor').
inV().property('amount', sack())).
times(1).iterate()
gremlin> g.V().valueMap()
==>[amount:[100],name:[a]]
==>[amount:[50.0],name:[b]]
==>[amount:[0],name:[c]]

最新更新