Я пытаюсь получить некоторые вершины идентичности и любые группы, частью которых они являются. Структура графа выглядит примерно так. Обратите внимание, что в Организации есть несколько пользователей, всех из которых я пытаюсь выбрать, и каждый из этих пользователей может входить в несколько групп. (По сути, это стандартная схема «учетная запись пользователя с группами».)
alice = g.addV('Identity').property('email', '[email protected]').next()
alfred = g.addV('Identity').property('email', '[email protected]').next()
org = g.addV('Organization').property('name', 'Example Inc').next()
[alice, alfred].each { g.V(org).addE('user').to(it).iterate() }
a = g.addV('Group').property('name', 'starts with A').next()
f = g.addV('Group').property('name', 'five letters').next()
[a, f].each { g.V(it).addE('member').to(alice).iterate() }
g.V(A).addE('member').to(alfred).iterate()
Основная логика моего обхода работает так, как ожидалось:
gts.V(organization)
.out(ORG_USERS).as('i')
.in(GROUP_USERS)
.valueMap('name').with(tokens)
.as('g')
.select('i', 'g')
.by(__.valueMap('email').with(tokens))
.toList()
Однако это создает список карт с ключами i
и g
, в частности, дублируя удостоверение, если оно находится в нескольких группах. Вместо этого я хотел бы свернуть группы. Я пробовал вот так (пока не пытаюсь дедуплицировать фактические результаты группы, просто сгруппировав их по идентификатору):
gts.V(organization)
.out(ORG_USERS).as('i')
.in(GROUP_USERS)
.valueMap('name').with(tokens)
.fold()
.as('gs')
.select('i', 'gs')
.by(__.valueMap('email').with(tokens))
.toList()
Однако, несмотря на то, что fold()
принимает обходчик с входящей группой как карта и просто возвращает результат fold()
, дает ожидаемый вложенный список, select('i', 'gs')
возвращает нулевые результаты. (Я могу select('gs')
, но и select('i')
, и select('i', 'gs')
пусты.)
Как мне структурировать обход, чтобы получить желаемый кортеж из (Identity, List [Group])?
fold
предыдущие метки, такие какi
, теряются. Вы сможете просто немного переписать и использоватьproject
. Если вы можете добавить несколько базовыхaddE
иaddV
шагов, которые построят образец графика, который упростит проверку ответа. - person Kelvin Lawrence   schedule 02.03.2021.where(...)
сразу послеin(GROUP_USERS)
. - person chrylis -cautiouslyoptimistic-   schedule 02.03.2021