Search code examples
gremlintinkerpopamazon-neptune

Updating a vertex property based on another


I'd like to update a highScore based on a users score when it is incremented. If the newly incremented score is greater than highScore, set highScore = score.

// initial data
g.addV("player")
  .property(id, 1)
  .property(single, "score", 0)
  .property(single, "highScore", 0)

// increment score by 1 and set highScore if required
g.V(1)
  .sack(assign)
  .by("score")
  .sack(sum)
  .by(__.constant(1))
  .property(single, "score", sack())
  .choose(
    __.values("highScore").is(lt(__.values("score"))),
    __.property(single, "highScore", __.values("score")))
  )

It seems to error on lt(__.values("score")). It's parsing that as a traversal instead of a value.

com.amazon.neptune.tinkerpop.structure.NeptuneGraph$NeptuneGraphTraversal cannot be cast to java.lang.Integer

How can I pass the current value of score into that predicate? I've tried adding .value(), .iterate(), and .next()


Solution

  • This approach using where() seems to work:

    gremlin> g.V(1).as('a').
    ......1>   sack(assign).
    ......2>     by("score").
    ......3>   sack(sum).
    ......4>     by(__.constant(1)).
    ......5>   property(single, "score", sack()).
    ......6>   choose(where('a', lt('a')).by('highScore').by('score'),
    ......7>          __.property(single, "highScore", sack()))
    ==>v[1]
    gremlin> g.V().valueMap()
    ==>[score:[1],highScore:[1]]
    gremlin> g.V(1).as('a').
    ......1>   sack(assign).
    ......2>     by("score").
    ......3>   sack(sum).
    ......4>     by(__.constant(1)).
    ......5>   property(single, "score", sack()).
    ......6>   choose(where('a', lt('a')).by('highScore').by('score'),
    ......7>          __.property(single, "highScore", sack()))
    ==>v[1]
    gremlin> g.V().valueMap()
    ==>[score:[2],highScore:[2]]
    gremlin> g.V().property('highScore',10)
    ==>v[1]
    gremlin> g.V().valueMap()
    ==>[score:[2],highScore:[10]]
    gremlin> g.V(1).as('a').
    ......1>   sack(assign).
    ......2>     by("score").
    ......3>   sack(sum).
    ......4>     by(__.constant(1)).
    ......5>   property(single, "score", sack()).
    ......6>   choose(where('a', lt('a')).by('highScore').by('score'),
    ......7>          __.property(single, "highScore", sack()))
    ==>v[1]
    gremlin> g.V().valueMap()
    ==>[score:[3],highScore:[10]]