Если я правильно понял ваши правила, то это должен быть запрос, который вы ищете:
gremlin> g.V().has('person','name','Jack').
bothE('knows','employeed').otherV().
sideEffect(hasLabel('company').aggregate('e')).barrier().
repeat(bothE('knows','employeed').otherV().simplePath()).
until(has('isSSEmployee',true).and().
not(__.in('employeed').where(within('e')))).
path().
by('name').
by(label).
map {it.get().objects().reverse()}
==>[Jim,knows,Mary,knows,Jack]
==>[Jim,knows,Mary,employeed,IBM,employeed,John,employeed,Coca Cola,employeed,Jack]
==>[Jim,knows,Mary,employeed,IBM,employeed,John,knows,Jerry,employeed,Coca Cola,employeed,Jack]
Однако это не соответствует вашим ожидаемым результатам, поэтому я думаю, что нам все еще нужны некоторые пояснения(Я обновлю ответ, как только мы получим это прямо).
ОБНОВЛЕНИЕ (путь должен содержать человека, который не работает ни одним из сотрудников Джека):
gremlin> g.V().has('person','name','Jack').
......1> sideEffect(__.in('employeed').aggregate('c')).barrier().
......2> repeat(bothE('knows','employeed').as('e').otherV().simplePath().as('p')).
......3> emit(__.and(has('isSSEmployee',true),
......4> select(all,'e').and(unfold().hasLabel('knows'),
......5> count(local).is(gt(1))))).
......6> filter(select(all, 'p').unfold().
......7> not(__.in('employeed').where(within('c')))).
......8> path().
......9> by('name').
.....10> by(label).
.....11> map {it.get().objects().reverse()}
==>[Jim,knows,Mary,knows,Jack]
==>[Jerry,knows,John,employeed,Coca Cola,employeed,Jack]
==>[Jerry,knows,John,employeed,IBM,employeed,Mary,knows,Jack]
==>[Jerry,employeed,Coca Cola,employeed,John,employeed,IBM,employeed,Mary,knows,Jack]
==>[Jim,knows,Mary,employeed,IBM,employeed,John,employeed,Coca Cola,employeed,Jack]
==>[Jim,knows,Mary,employeed,IBM,employeed,John,knows,Jerry,employeed,Coca Cola,employeed,Jack]