Гремлин: проблемы с группировкой по нескольким связанным вершинам - PullRequest
0 голосов
/ 12 апреля 2019

Я на начальных этапах изучения гремлина и поэтому начинаю с проекта в OrientDB (с включенным tinkerpop), использующего гремлин. У меня есть следующие вершины

команды клиенты лиц технологии

Для всех намерений и целей работали только с командами, клиентами и технологиями.

Команды поддерживают клиентов, клиент внедряет технологии. Таким образом, схема для этой проблемы выглядит следующим образом

Vertex (метка: команда) -> Пограничные (метка: опоры) -> Vertex (метка: клиент) -> Край (метка: has_implemented) -> Vertex (метка: технология)

Каждый клиент будет поддерживаться только одной командой, но технологии могут использоваться моими несколькими клиентами.

То, что я пытаюсь получить, - это количество технологий, которые будут поддерживаться каждой командой путем проверки клиентов, которых они поддерживают, и технологий, которые используют эти клиенты.

Используя приведенный ниже код, я могу получить количество каждого отдельного номера команды и технологии, но я не могу сделать заказ по убыванию числа. Я посмотрел на другие примеры группировки по обмену стека и думаю, что с select () дела идут не так, но я не уверен, что мне следует делать вместо этого.

g.V().hasLabel('team').as('a').out('supports').out('has_implemented').as('b').select('a','b').by('teamnumber').by('name').groupCount().as('count').unfold()

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Шаг groupCount() возвращает Map.Вы можете использовать order() для сортировки по значениям Map - должно работать следующее:

g.V().hasLabel('team').as('a').
  out('supports'). 
  out('has_implemented').as('b').
  select('a','b').
    by('teamnumber').
    by('name').
  groupCount().
  order(local).
    by(values,desc)

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

g.V().hasLabel('team').as('a').
  out('supports'). 
  out('has_implemented').
  groupCount().
    by(select('a')).
  order(local).
    by(values,desc)
0 голосов
/ 17 апреля 2019

Так как вопрос в основном о заказе, я думаю, что Стивен ответил на него отлично; Тем не менее, я думаю, что я бы предпочел следующий запрос:

g.V().hasLabel('team').
  project('team','technologies').
    by('teamnumber').
    by(out('supports').
       out('has_implemented').
       groupCount().
         by('name').
       order(local).
         by(values, desc))

Просто потому, что не требует отслеживания пути (поэтому он должен работать быстрее и использовать меньше памяти).

Кроме того, я не уверен, действительно ли вам небезразличны названия технологий. Подсчет групп в приведенном выше запросе имеет смысл только в том случае, если несколько клиентов используют одну и ту же технологию (в результате можно сказать, что «Team X поддерживает технологию Y, которая используется Z ее клиентов»). Возможно, вы просто хотите узнать, сколько уникальных технологий поддерживает каждая команда, тогда запрос будет еще проще:

g.V().hasLabel('team').
  project('team','technologies').
    by('teamnumber').
    by(out('supports').
       out('has_implemented').
       dedup().count()).
  order().
    by(select('technologies'), desc)
...