Получить другую вершину метки для группирования по дате - PullRequest
0 голосов
/ 07 мая 2019
    v1=graph.addVertex(label,"l1","submit_time",Fri Apr 26 21:01:36 PDT 2019) //v[2345432]
    v2=graph.addVertex(label,"l2","start_time",Fri Apr 26 22:01:36 PDT 2019) // v[409632904]
    v3=graph.addVertex(label,"l2","start_time",Fri Apr 26 22:01:36 PDT 2019)  //v[204824704]
    v4=graph.addVertex(label,"l2","start_time",Fri Apr 26 23:01:36 PDT 2019). //v[307241008]

    Edge e1 = v1.addEdge("e1", v2);
    Edge e2 = v1.addEdge("e1", v3);
    Edge e3 = v1.addEdge("e1", v4);




    g.V().hasLabel("l2").group().by(map{(it.get().value("start_time").getYear()+1900)+"/"+(it.get().value("start_time").getMonth()+1)+"/"+it.get().value("start_time").getDate()+" "+it.get().value("start_time").getHours()})

мы получаем ниже вывод: Output1: 2019/4/26 23: [v [307241008]], 2019/4/26 22: [v [409632904], v [204824704]]

Может ли кто-нибудь помочь мне получить для каждого из агрегированных значений (агрегированных по l2 и все вершины l2 имеет ребро к l1), поэтому мне нужно получить соответствующую вершину метки l1 также в одном запросе. например: Выход2: 2019/4/26 23: [v [307241008]], v [2345432] 2019/4/26 22: [v [409632904], v [204824704]], v [2345432] Спасибо.

1 Ответ

2 голосов
/ 07 мая 2019

Позвольте мне начать с правильного сценария для создания примера графика, чтобы другие могли легче следовать:

g = TinkerGraph.open().traversal()
g.addV('l1').
    property(id, 2345432).
    property('submit_time', new Date('Fri Apr 26 21:01:36 PDT 2019')).
  addV('l2').
    property(id, 409632904).
    property('start_time', new Date('Fri Apr 26 22:01:36 PDT 2019')).
  addV('l2').
    property(id, 204824704).
    property('start_time', new Date('Fri Apr 26 22:01:36 PDT 2019')).
  addV('l2').
    property(id, 307241008).
    property('start_time', new Date('Fri Apr 26 23:01:36 PDT 2019')).
  addE('e1').from(V(2345432)).to(V(409632904)).
  addE('e1').from(V(2345432)).to(V(204824704)).
  addE('e1').from(V(2345432)).to(V(307241008)).iterate()

И ваш запрос правильно отформатирован:

g.V().hasLabel("l2").
  group().
    by {(it.value("start_time").getYear() + 1900) + "/" +
        (it.value("start_time").getMonth() + 1) + "/" +
         it.value("start_time").getDate() + " " +
         it.value("start_time").getHours()}

Теперь, если вы хотите добавить все вершины l1, вы больше не можете использовать простой Map для вашего результата. Каждой записи нужна своя карта, поэтому вы можете захватить третье поле. Таким образом, вам нужно развернуть карту и изменить ее с шагом project():

g.V().hasLabel("l2").
  group().
    by {(it.value("start_time").getYear() + 1900) + "/" +
        (it.value("start_time").getMonth() + 1) + "/" +
         it.value("start_time").getDate() + " " +
         it.value("start_time").getHours()}.
  unfold().
  project('time','l2','l1').
    by(keys).
    by(values).
    by(select(values).unfold().in('e1').dedup().fold())

Это даст:

gremlin> g.V().hasLabel("l2").
......1>   group().
......2>     by {(it.value("start_time").getYear() + 1900) + "/" +
......3>         (it.value("start_time").getMonth() + 1) + "/" +
......4>          it.value("start_time").getDate() + " " +
......5>          it.value("start_time").getHours()}.
......6>   unfold().
......7>   project('time','l2','l1').
......8>     by(keys).
......9>     by(values).
.....10>     by(select(values).unfold().in('e1').dedup().fold())
==>[time:2019/4/26 23,l2:[v[307241008]],l1:[v[2345432]]]
==>[time:2019/4/26 22,l2:[v[409632904],v[204824704]],l1:[v[2345432]]]
...