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

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

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

[
  {"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]]]
...

1 Ответ

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

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

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

... или ...

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...