Gremlin - добавление новой вершины, если она превышает предел - PullRequest
0 голосов
/ 13 июня 2019

Пример данных:

У меня есть две вершины по именам Пользователь, Точки

Первое добавление данных для вершины Пользователь

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 точек случайным образом к totalPoints Свойство пользователя с id как 1

при добавлении баллов у меня есть три случая:

1. Если totalPoints равны lt500 Тогда мне просто нужно обновить totalPoints свойство Points вершина пользователя с id как 1.

2.If totalPoints - eq500 Тогда я долженсоздайте новую точки вершины и добавьте точки к totalPoints свойство точки вершины пользователя с id как 1.

3. Если Всего очков 490, что не eq500, а lt500.Но теперь, если мне нужно добавить 30 точек к свойству totalPoints , мне нужно добавить 10 точек к старой Points вершине пользователя с id в качестве 1 иЯ должен добавить оставшиеся 20 баллов к новой Баллам вершины пользователя с id как 1.

Как мне этого добиться.

Спасибо.

1 Ответ

2 голосов
/ 13 июня 2019
  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]
...