如何通过 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
乘以 >因素
连接它们的边缘。例如。 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”,并开始遍历,迭代地遍历我们乘以(即mult
)的“drain”边缘袋中的值由“漏极”边缘上的“因子”属性决定。然后,通过 property()
步骤将 sack 分配给下一个顶点。
请注意,您可以使用 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]]
关于graph - 如何在 TinkerPop 图中传播值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41051109/