Gremlin - 如果超过限制,则添加新顶点



示例数据:

我有两个顶点,名称为用户,点

首先为顶点用户添加数据

g.addV('User').property('id',1).
addV('User').property('id',2).
addV('User').property('id',3).iterate()

现在添加点顶点并将添加点边从用户连接到

g.V().hasLabel('User').has('id',1).as('curUser1').
V().hasLabel('User').has('id',2).as('curUser2').
V().hasLabel('User').has('id',3).as('curUser3').
addV('Points').property('totalPoints',0).property('userPoints',0).
property('createDate',1560316666).property('name','user1').
addE('addingPoints').from('curUser1').
addV('Points').property('totalPoints',0).property('userPoints',0).
property('createDate',1560318666).property('name','user2').
addE('addingPoints').from('curUser2').
addV('Points').property('totalPoints',0).property('userPoints',0).
property('createDate',1560318657).property('name','user3').
addE('addingPoints').from('curUser3').iterate()

现在,每个用户至少有一个点顶

现在我想将 10(或)20(或)30 个点随机添加到id为 1 的用户的总属性

在补充要点的同时,我有三种情况:

1.如果积分是lt500,那么我只需要更新id为1的用户顶点的总积分属性。

2.如果点数是eq500,那么我应该创建新的点顶点,并将点添加到id为1的用户顶点的总属性中。

3.如果总积分为490,则不是eq500,而是lt500。但是现在如果我需要在总积分属性中添加 30 分 然后我需要在id为 10 的用户的旧点顶点上添加 1 个点,我应该将剩余的 20 个点添加到id为 1 的用户的新点顶上。

我怎样才能做到这一点。

谢谢。

  1. 选择具有最低totalPoints值的用户Points顶点。
  2. 用新的点数对totalPoints求和。
  3. 如果总和超过 500,请将totalPoints属性值设置为 500,并添加一个totalPoints值为sum-500的新Points顶点。
  4. 如果总和不超过 500,请将其设置为新的totalPoints属性值。

这 4 个步骤转化为遍历:

g.withSack(points).
V().has('User','id',user).as('u').
out('addingPoints').
order().
by('totalPoints').
limit(1).
sack(sum).
by('totalPoints').
choose(sack().is(gt(maxPoints)),
sack(minus).
by(constant(maxPoints)).
property('totalPoints', maxPoints).
addV('Points').
sideEffect(addE('addingPoints').
from('u'))).
property('totalPoints', sack())

还有一个小的控制台示例(我用totalPoints=400初始化了第一个Points顶点,用totalPoints=480初始化了第二个Points顶点):

gremlin> showUserPoints = {
......1>   g.V().as('u').out('addingPoints').
......2>     group().
......3>       by(select('u').by('id')).
......4>       by('totalPoints').next()
......5> }
==>groovysh_evaluate$_run_closure1@7c2b58c0
gremlin> addPoints = { user, points, maxPoints = 500 ->
......1>   g.withSack(points).
......2>     V().has('User','id',user).as('u').
......3>       out('addingPoints').
......4>       order().
......5>         by('totalPoints').
......6>       limit(1).
......7>       sack(sum).
......8>         by('totalPoints').
......9>       choose(sack().is(gt(maxPoints)),
.....10>                sack(minus).
.....11>                  by(constant(maxPoints)).
.....12>                property('totalPoints', maxPoints).
.....13>                addV('Points').
.....14>                sideEffect(addE('addingPoints').
.....15>                             from('u'))).
.....16>       property('totalPoints', sack()).iterate()
.....17> 
.....17>   showUserPoints()
.....18> }
==>groovysh_evaluate$_run_closure1@31d6f3fe
gremlin> showUserPoints()
==>1=[400]
==>2=[480]
==>3=[0]
gremlin> addPoints(1, 10)
==>1=[410]
==>2=[480]
==>3=[0]
gremlin> addPoints(1, 90)
==>1=[500]
==>2=[480]
==>3=[0]
gremlin> addPoints(2, 30)
==>1=[500]
==>2=[500, 10]
==>3=[0]
gremlin> addPoints(2, 40)
==>1=[500]
==>2=[500, 50]
==>3=[0]
gremlin> addPoints(3, 100)
==>1=[500]
==>2=[500, 50]
==>3=[100]

最新更新