首页 文章

如何在TinkerPop图中传播值

提问于
浏览
2

我是TinkerPop的新手,所以不太确定这是由Gremlin或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 ['amount']将等于50.然后进一步传播c ['amount']将等于5 .

理想情况下,我想知道一个语句可以一次向下传播值,但是一个语句可能会将它传播到第一个相邻的顶点然后在第二次调用时会将它传播到下一个顶点等

这是否可以在Gremlin中完成,或者我是否需要TinkerPop的其他部分?

-Matt

1 回答

  • 4

    我设法使用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"边缘,我们将"drain"边缘上的"factor"属性乘以(即 mult )袋中的值 . 然后通过 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]]
    

相关问题