Найдите разницу между поддеревьями в Гремлине

Я описал график здесь, на странице gremlify. Итак, у меня есть четыре типа вершин: Контент, Пользователь, Группа и Видео. Контент и Группа служат контейнером, Пользователь и Видео - листьями. Кроме того, у меня есть возможные границы между Group и User, Group и Content, Группа и Видео. Пользователь также может быть назначен непосредственно для Видео и Контента. Видео можно добавить в вершину Content. Мне нужно вычислить разницу в дереве, когда Content удаляется из Group. Я создал запрос, который проходит от Content, объединяет всех напрямую назначенных Users, а затем вычитает этих Users из Group набор членов:

g.V().has('ContentId', 1).in('Assigned').
  choose(label()).
  option('User', __.aggregate('DirectAssign')).
  option('Group', __.out('Added').where(without('DirectAssign')).
      as('ToDrop'))
      .select('ToDrop')

Однако есть несколько недостатков:

  • Сомневаюсь, что запрос оптимален с точки зрения масштаба и производительности, так как на 100к пользователей в группе он потребляет почти все мои RU
  • Мне нужно рассчитать доступ к видео для каждого пользователя индивидуально (не беда)
  • Я не могу написать этот запрос в добавленной структуре ORM, так как aggregate создает там новую область и невозможно сослаться на эту агрегированную коллекцию на шаге 2-го варианта.

Итак, мой вопрос: можно ли переписать этот запрос (оставить его единым) без шага choose?


person vmeln    schedule 05.03.2021    source источник


Ответы (1)


Если я понял ваш вариант использования, вы можете найти этих пользователей, вернувшись к контенту. и поэтому вы можете избежать aggregate и choose шагов.

g.V().hasLabel('Content').
    as('content').
  in('Assigned').hasLabel('Group').out('Added').
  not(where(out('Assigned').
        as('content')))

пример: https://gremlify.com/ozhf4t0xv4j

person noam621    schedule 10.03.2021
comment
Работает как шарм, идеально. Не могли бы вы объяснить это волшебство с помощью as в конце? - person vmeln; 10.03.2021
comment
@vmeln as - это не обычный шаг, и он ведет себя по-разному в зависимости от контекста, в котором он находится (аналогично шагу by). внутри шага where вместо того, чтобы маркировать вершину, он сравнивает ее с уже помеченной вершиной. это общий рецепт в гремлине, и вы можете найти его в любом запросе на определение цикла - person noam621; 10.03.2021