如何在 TinkerPop 图中传播值

How to propagate a value in a TinkerPop graph

我如何 'propagate' 通过 TinkerPop 图表获取值?即给定一个顶点上的 属性 值,我想 'move' 该值沿边到另一个顶点或一组顶点。

例如,给出这个包含 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['amount'] 将等于 50。然后进一步传播 c['amount'] 将等于 5.

理想情况下,我想知道一个语句可以一次性将值传播到链下,还有一个语句可以将它传播到第一个相邻顶点,然后在第二次调用时传播它到下一个顶点等

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

我设法使用 Gremlin sacks:

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]]

我将 "sack value" 初始化为等于顶点 "a" 中的 "amount" 并从那里开始遍历,迭代遍历我们相乘的 "drain" 边(即 mult) "factor" 属性 在 "drain" 边上的麻袋中的值。然后通过 property() 步骤将麻袋分配给下一个顶点。

请注意,您可以在 repeat 上使用适当的循环语义来控制 "drain"(即您希望在链中走多远)。现在它使用 until() "there are no more outgoing edges"。但您也可以按如下方式终止仅一步之遥:

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]]