Гремлин: вычислить деление на основе двух подсчетов в одной строке кода - PullRequest
0 голосов
/ 21 марта 2019

У меня есть два счета, рассчитанные следующим образом:

1) gV (). HasLabel ('brand'). Where (__. InE ('client_brand'). Count (). Is (gt (0))). Count ()

2) gV (). HasLabel ('brand'). Count ()

, и я хочу получить одну строку кода, которая приводит к первойколичество делится на второе.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вот один из способов сделать это:

g.V().hasLabel('brand').
  fold().as('a','b').
  math('a/b').
    by(unfold().where(inE('client_brand')).count())
    by(unfold().count())

Обратите внимание, что я упрощаю первый обход до .where(inE('client_brand')).count(), поскольку вам нужно только сосчитать, что есть хотя бы одно ребро, нет необходимости подсчитывать их все и сравнивать.

Вы также можете union(), как:

g.V().hasLabel('brand').
  union(where(inE('client_brand')).count(),
        count())
  fold().as('a','b').
  math('a/b').
    by(limit(local,1))
    by(tail(local))

В то время как первый был немного проще для чтения / отслеживания, я думаю, что второй лучше, потому что он хранит только список из двух подсчетов, тогда как первый хранит список всех вершин "бренда", которые были бы более память интенсивная, я думаю.

Еще один способ, предоставленный Дэниелом Куппицем, который использует groupCount() интересным образом:

g.V().hasLabel('brand').
  groupCount().
    by(choose(inE('client_brand'),
                constant('a'),
                constant('b'))).
  math('a/(a+b)')

Следующее решение, которое использует sack() step, показывает, почему мы имеем math() step:

g.V().hasLabel('brand').
  groupCount().
    by(choose(inE('client_brand'),
                constant('a'),
                constant('b'))).
  sack(assign).
    by(coalesce(select('a'), constant(0))).
  sack(mult).
    by(constant(1.0)). /* we need a double */
  sack(div).
    by(select(values).sum(local)).
  sack()

Если вы можете использовать лямбды, то:

g.V().hasLabel('brand').
  union(where(inE('client_brand')).count(),
        count())
  fold().
  map{ it.get()[0]/it.get()[1]} 
0 голосов
/ 22 марта 2019

Вот что у меня сработало:

g.V().limit(1).project('client_brand_count','total_brands')
.by(g.V().hasLabel('brand')
.where(__.inE('client_brand').count().is(gt(0))).count())
.by(g.V().hasLabel('brand').count())
.map{it.get().values()[0] / it.get().values()[1]}
.project('brand_client_pct')
...