Graph 如何在TinkerPop图中传播值

Graph 如何在TinkerPop图中传播值,graph,titan,gremlin,tinkerpop,Graph,Titan,Gremlin,Tinkerpop,我是TinkerPop的新手,所以不太确定这是由Gremlin处理的还是TinkerPop的另一部分: 我如何通过TinkerPop图“传播”一个值?i、 e.给定一个顶点上的属性值,我想将该值沿边“移动”到另一个顶点或一组顶点 例如,给出3个顶点和2条连接它们的边的简单图: gremlin> graph = TinkerGraph.open() ==>tinkergraph[vertices:0 edges:0] gremlin> g = graph.traversal()

我是TinkerPop的新手,所以不太确定这是由Gremlin处理的还是TinkerPop的另一部分:

我如何通过TinkerPop图“传播”一个值?i、 e.给定一个顶点上的属性值,我想将该值沿边“移动”到另一个顶点或一组顶点

例如,给出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
中的
数量
复制到
b
乘以连接它们的边中的
因子。例如,b['amount']等于50。然后进一步传播的c['amount']将等于5

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

这是可以用小精灵来完成的,还是我需要TinkerPop的其他部分


-马特

我用小精灵做到了这一点:

我初始化了等于顶点“a”中“amount”的“sack value”,并在“drain”边上迭代遍历sack中的值(即,
mult
),然后将sack中的值乘以“drain”边上的“factor”属性。然后通过
属性()
步骤将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]]

太棒了,谢谢你!如果我想进一步扩展一般问题,使每个顶点上都有关于值是否传播的逻辑,并且值本身可能是顶点上多个属性的函数,那么编写一个Vertexprogram在图形计算机上运行会是一种方法吗?他们是否必须用Java编写,或者是否可以使用python变体?将这些附加功能添加到上面不会太难,也不需要VertexProgram。为了防止传播,您只需要控制循环,因此让您的
until()
评估顶点属性,以确定它是否应该中断。如果您需要更复杂的逻辑来增加sack,那么有两个选项:首先,您可以将调用链接到
sack()
。其次,可以使用lambda修改sack值。在一天结束时,
sack()
方法只需要一个
BiFunction
,这样计算就可以做任何你想做的事情mult只是一个辅助操作符。
VertexProgram
实例必须用java编写。它们是核心API的一部分,没有扩展到GLV(Gremlin语言变体)。好的,谢谢你提供的信息。我试图解决的下一个问题不是像上面那样沿着链传播值,而是如何通过指向顶点的边属性中的值来增加/减少顶点上的属性。我将把它作为一个单独的问题写下来,尽管我已经做了一些尝试。
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]]