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

时间:2019-06-13 12:53:28

标签: gremlin tinkerpop

样本数据:

我有两个名为User,点的顶点

首先为顶点用户

添加数据
g.addV('User').property('id',1).
  addV('User').property('id',2).
  addV('User').property('id',3).iterate()

现在添加 Points 顶点并将 addingPoints Edge从 User 连接到 Points

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()

现在每个用户具有至少一个 Points 个顶点。

现在,我想向 id 为1

的用户的 totalPoints 属性中随机添加10(或)20(或)30点

在添加点时,我有三种情况:

1。如果 totalPoints 是lt500,那么我只需要使用 id <>来更新用户 Points 顶点的 totalPoints 属性。 / strong>为1。

2。如果 totalPoints 为eq500,那么我应该创建新的 Points 顶点并将点添加到 Points totalPoints 属性中 id 为1的用户的strong>顶点。

3。如果 totalPoints 是490,则不是eq500,而是lt500。但是现在,如果我需要在 totalPoints 属性中添加30点 那么我需要向具有 id 的用户的旧 Points 顶点添加10点,然后将剩余的20点添加到新的 Points 顶点 id 为1的用户的数量。

我如何实现这一目标。

谢谢。

1 个答案:

答案 0 :(得分:2)

  1. 选择具有最低Points值的用户totalPoints顶点。
  2. totalPoints与新的点数相加。
  3. 如果总和超过500,请将totalPoints属性值设置为500,并添加一个Points值为totalPoints的新sum-500顶点。
  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())

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

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]