gpt4 book ai didi

graph - 如何在TinkerPop图中增加顶点属性值

转载 作者:行者123 更新时间:2023-12-04 13:57:31 26 4
gpt4 key购买 nike

如何遍历图形并增加顶点属性的值?以某个固定量或者以导致该边缘的边的属性中的一个量。

例如。带有下图:

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', 200).next()
==>v[3]
gremlin> c = g.addV('name','c','amount', 300).next()
==>v[6]
gremlin> a.addEdge('fill', b, 'bonus', 20)
==>e[9][0-drain->3]
gremlin> b.addEdge('fill', c, 'bonus', 40)
==>e[10][3-drain->6]
gremlin>

所以

1)我如何通过 10递增每个顶点?

最后,我想拥有:
gremlin> g.V().valueMap()
==>[amount:[110],name:[a]]
==>[amount:[210.0],name:[b]]
==>[amount:[310.00],name:[c]]

鉴于声明:
g.V(a).property('amount', X)

我想我正在尝试做类似的事情:
g.V(a).property('amount', g.V(a).values('amount').next()+10)

...但是对于我图中的所有顶点。看起来Tinkerpop2的 loop()it.object可能有所帮助,但似乎在Tinkerpop3中却没有

编辑:好的,我离那儿很近,但还不止于此:
gremlin> g.V().as('x').property('amount', select('x').by('amount')+10)
No signature of method: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.plus() is applicable for argument types: (java.lang.Integer) values: [10]
Possible solutions: sum(), take(int), sum(groovy.lang.Closure), is(java.lang.Object), use([Ljava.lang.Object;), drop(int)
Type ':help' or ':h' for help.
Display stack trace? [yN]

2)如何将每个顶点增加到导致该顶点的 bonus边中的 fill属性的值。

最后,我想拥有:
gremlin> g.V().valueMap()
==>[amount:[100],name:[a]]
==>[amount:[220.0],name:[b]]
==>[amount:[340.00],name:[c]]

我尝试使用 sack来执行此操作,但由于麻袋在遍历过程中累积了数据,​​因此无法完全解决。我试图将 withSack放入 repeat子句中,以尝试创建一个新的麻袋,但这没有用。我看不到如何将属性值从一个顶点“传递”到下一个顶点的操作。

最佳答案

让我使用TinkerPop的玩具图,这样其他人就更容易理解了。玩具图包含4个人顶点,这些顶点具有age属性:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has("age").valueMap()
==>[name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[josh],age:[32]]
==>[name:[peter],age:[35]]

为了回答您的第一个问题,让我们添加一个常量值( 10):
gremlin> g.V().has("age").
property("age", union(values("age"), constant(10)).sum()).valueMap()
==>[name:[marko],age:[39]]
==>[name:[vadas],age:[37]]
==>[name:[josh],age:[42]]
==>[name:[peter],age:[45]]

另一种技术是使用 sack():
gremlin> g.withSack(0).V().has("age").
sack(assign).by("age").sack(sum).by(constant(10)).
property("age", sack()).valueMap()
==>[name:[marko],age:[39]]
==>[name:[vadas],age:[37]]
==>[name:[josh],age:[42]]
==>[name:[peter],age:[45]]

现在是关于添加来自入射边缘的动态值的第二个问题。在玩具图中,我们在每个边缘上都有一个 weight属性,因此让我们使用它:
gremlin> g.V().has("age").
property("age", union(values("age"), bothE().values("weight")).sum()).valueMap()
==>[name:[marko],age:[30.9]]
==>[name:[vadas],age:[27.5]]
==>[name:[josh],age:[34.4]]
==>[name:[peter],age:[35.2]]

同样,您也可以使用 sack():
gremlin> g.withSack(0).V().has("age").
sack(assign).by("age").sack(sum).by(bothE().values("weight").sum()).
property("age", sack()).valueMap()
==>[name:[marko],age:[30.9]]
==>[name:[vadas],age:[27.5]]
==>[name:[josh],age:[34.4]]
==>[name:[peter],age:[35.2]]

因此,最终的问题是:一种技术应优先于另一种?我会说是的, sack()应该是您的选择-根据您键入的内容,遍历时间更长,但是从 .profile()输出来看, sack()可以轻松胜过 union()

关于graph - 如何在TinkerPop图中增加顶点属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41063562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com