Гремлин: разделение по группам - PullRequest
0 голосов
/ 23 мая 2019

Я использую Gremlin для запроса Нептуна.

У меня есть 2 счета

  1. gV (). HasLabel (*). OutE.inV (). GroupCount (). By('name') результат выглядит так: 'a': 2, 'b': 4
  2. gV (). hasLabel (*). count () 4

Как можноЯ пишу один запрос, чтобы получить числа, которые в результате 1, деленные на результат 2?то есть «а»: 0,5, «б»: 1

1 Ответ

2 голосов
/ 23 мая 2019

Я могу придумать несколько способов, но, думаю, использование match() является самым простым:

g.V().hasLabel(*).
  union(count(),
        out().groupCount().by('name')).fold().
  match(__.as('values').limit(local, 1).as('c'),
        __.as('values').tail(local, 1).unfold().as('kv'),
        __.as('kv').select(values).math('_/c').as('v')).
  group().
    by(select('kv').by(keys)).
    by(select('v'))

Аналогичный запрос на современном графике:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().union(count(),
......1>             out().groupCount().by(label)).fold().
......2>   match(__.as('values').limit(local, 1).as('c'),
......3>         __.as('values').tail(local, 1).unfold().as('kv'),
......4>         __.as('kv').select(values).math('_/c').as('v')).
......5>   group().
......6>     by(select('kv').by(keys)).
......7>     by(select('v'))
==>[software:0.6666666666666666,person:0.3333333333333333]

Следующийвозможно, его сложнее понять, но он будет моим любимым (потому что а) мне не нравится match() и б) он не зависит от порядка результатов, возвращаемых union()):

gremlin> g.V().
......1>   groupCount('a').
......2>     by(constant('c')).
......3>   out().
......4>   groupCount('b').
......5>     by(label).
......6>   cap('a','b').as('x').
......7>   select('a').select('c').as('c').
......8>   select('x').select('b').unfold().
......9>   group().
.....10>     by(keys).
.....11>     by(select(values).math('_/c'))
==>[software:0.6666666666666666,person:0.3333333333333333]
...