GroupBy запрос со списком вершин

Предположим, я хочу запросить граф Нептуна с «группировкой» по одному свойству (или более), и я хочу также получить обратно список вершин.

Скажем, я хочу сгруппировать по ("город", "возраст") и тоже хочу получить список вершин:

[
  {"city": "SFO", "age": 29, "persons": [v[1], ...]},
  {"city": "SFO", "age": 30, "persons": [v[10], v[13], ...]}, 
  ...
]

Или верните вершину со своими свойствами (как valueMap):

[
  {"city": "SFO", "age": 29, "persons": [[id:1,label:person,name:[marko],age:[29],city:[SFO]], ...]},
  ...
]

AFAIK, Нептун не поддерживает лямбда-выражения и присвоение переменных. есть ли способ сделать это с одним обходом и без лямбд?

Обновление: я могу получить вершины, но без их свойств (с valueMap).

Запрос:

g.V().hasLabel("person").group().
   by(values("city", "age").fold()).
   by(fold().
     match(__.as("p").unfold().values("city").as("city"),
           __.as("p").unfold().values("age").as("age"),
           __.as("p").fold().unfold().as("persons")).
     select("city", "age", "persons")).
   select(values).
   next()

Выход:

==>[city:SFO,age:29,persons:[v[1]]]
==>[city:SFO,age:27,persons:[v[2],v[23]]]
...

person dfek    schedule 20.04.2019    source источник
comment
Что ты пробовал? Может быть, я что-то упускаю, но сейчас я не понимаю, где и зачем вообще использовать лямбду   -  person Daniel Kuppitz    schedule 21.04.2019
comment
Я обновил вопрос о своем прогрессе.   -  person dfek    schedule 21.04.2019


Ответы (1)


Если я правильно понимаю, то ...

g.V().hasLabel("person").
  group().
    by(values("city", "age").fold())

... or ...

g.V().hasLabel("person").
  group().
    by(valueMap("city", "age").by(unfold()))

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

g.V().hasLabel("person").
  group().
    by(valueMap("city", "age").by(unfold())).
  unfold().
  map(union(select(keys), 
            project("persons").
              by(values)).
      unfold().
      group().
        by(keys).
        by(select(values)))

Выполнение этого на современном игрушечном графике (city заменено на name) даст следующий результат:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin>     g.V().hasLabel("person").
......1>       group().
......2>         by(valueMap("name", "age").by(unfold())).
......3>       unfold().
......4>       map(union(select(keys), 
......5>                 project("persons").
......6>                   by(values)).
......7>           unfold().
......8>           group().
......9>             by(keys).
.....10>             by(select(values)))
==>[persons:[v[2]],name:vadas,age:27]
==>[persons:[v[4]],name:josh,age:32]
==>[persons:[v[1]],name:marko,age:29]
==>[persons:[v[6]],name:peter,age:35]
person Daniel Kuppitz    schedule 21.04.2019
comment
Ты прав. Я переформатирую вывод, потому что я не могу представить исходный обход группировки как действительный JSON (ключи карты относятся к типу списка). Спасибо за вашу помощь. - person dfek; 22.04.2019