Search code examples
gremlintinkerpop3

Gremlin math step alternative on Gremlin 3.2.4


Math function looks added on version 3.3.1 (http://tinkerpop.apache.org/docs/3.3.9-SNAPSHOT/upgrade/#_added_code_math_code_step_for_scientific_traversal_computing)

But I use https://github.com/microsoft/spring-data-gremlin. And it supports version 3.2.4

Is there a way to use math function on gremlin 3.2.4?

GraphTraversal t = graph.V().hasLabel("App").as("a")
        .inE("RANKS").as("r")
        .outV().as("k")
        .choose(__.select("k").by("countryCode").is(__.in(...)),
                __.math("1.0 / r").by("rank1"),
                __.math("1.0 / r").by("rank2"))
        .as("score")
        ...;

Solution

  • You might be able to use sack() in this case:

    gremlin> g.addV('App').as('a').
    ......1>   addV().property('countryCode','US').as('p1').
    ......2>   addV().property('countryCode','CA').as('p2').
    ......3>   addE('RANKS').property('rank1',5).property('rank2',10).from('p1').to('a').
    ......4>   addE('RANKS').property('rank1',3).property('rank2',6).from('p2').to('a').iterate()
    gremlin> g.V().hasLabel("App").as("a").
    ......1>   inE("RANKS").as("r").sack(assign).by(constant(1.0)).
    ......2>   outV().as("k").
    ......3>   choose(__.select("k").by("countryCode").is(within('US')),
    ......4>          select('r').sack(div).by("rank1"),
    ......5>          select('r').sack(div).by("rank2")).
    ......6>   sack().as("score").
    ......7>   select('a','r','k','score')
    ==>[a:v[0],r:e[5][1-RANKS->0],k:v[1],score:0.2]
    ==>[a:v[0],r:e[6][3-RANKS->0],k:v[3],score:0.1666666667]