如何增加 TinkerPop 图中的顶点 属性 值
How to increment a vertex property value in a TinkerPop graph
我将如何遍历图形并增加顶点的值 属性?可以是某个固定数量,也可以是通向它的边的 属性 中的数量。
例如。如下图:
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
子句中以尝试创建一个新的 sack,但这没有用。我不明白如何 'pass' 一个 属性 的值从一个顶点到下一个顶点的操作。
让我使用 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()
s:
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()
.
我将如何遍历图形并增加顶点的值 属性?可以是某个固定数量,也可以是通向它的边的 属性 中的数量。
例如。如下图:
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
子句中以尝试创建一个新的 sack,但这没有用。我不明白如何 'pass' 一个 属性 的值从一个顶点到下一个顶点的操作。
让我使用 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()
s:
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()
.