Tinkerpop Выбирает соседей, сгруппированных по вершине, они являются соседями с шагом диапазона

#gremlin #tinkerpop #tinkerpop3 #gremlin-server #tinkergraph

#gremlin #tinkerpop #tinkerpop3 #gremlin-сервер #tinkergraph

Вопрос:

Я хочу выбрать все l помеченные вершины вместе с их t помеченными вершинами, сгруппированными по их соседям. Также я хочу применить ограничение на длину соседей. Например, для neighbor limit = 2 должно быть выведено что-то вроде приведенного ниже.

 [
{"l1",[t1,t2]},
{"l2",[t3]},
{"l3",[]}
]
  

Например, для neighbor limit = 1 должно быть выведено что-то вроде приведенного ниже.

 [
{"l1",[t1]},
{"l2",[t3]},
{"l3",[]}
]
  

ссылка grelify https://gremlify.com/xun4v83y54/1

 g.addV('Vertex').as('1').property(single, 'name', 'l1').property(single, 'label', 'l').
  addV('Vertex').as('2').property(single, 'name', 'l2').property(single, 'label', 'l').
  addV('Vertex').as('3').property(single, 'name', 'l3').property(single, 'label', 'l').
  addV('Tag').as('4').property(single, 'name', 't1').property(single, 'label', 't').
  addV('Tag').as('5').property(single, 'name', 't2').property(single, 'label', 't').
  addV('Tag').as('6').property(single, 'name', 't3').property(single, 'label', 't').
  addE('connected').from('1').to('4').
  addE('connected').from('1').to('5').
  addE('connected').from('2').to('6')
  

Ответ №1:

Я думаю, group() здесь было бы хорошо:

 gremlin> g.V().has('label','l').
......1>   group().
......2>     by('name').
......3>     by(out().limit(2).values('name').fold())
==>[l1:[t1,t2],l2:[t3]]
gremlin> g.V().has('label','l').
......1>   group().
......2>     by('name').
......3>     by(out().limit(1).values('name').fold())
==>[l1:[t1],l2:[t3]]
  

Обратите внимание, что второй by() модулятор — это операция сокращения для сгруппированных вами собранных элементов. Там вы можете дополнительно манипулировать этой коллекцией по мере необходимости. Чтобы продемонстрировать, я немного изменил ваши данные:

 g.addV('Vertex').as('1').property(single, 'name', 'l1').property(single, 'label', 'l').
  addV('Vertex').as('2').property(single, 'name', 'l2').property(single, 'label', 'l').
  addV('Vertex').as('3').property(single, 'name', 'l3').property(single, 'label', 'l').
  addV('Tag').as('4').property(single, 'name', 't1').property(single, 'label', 't').
  addV('Tag').as('5').property(single, 'name', 't2').property(single, 'label', 't').
  addV('Tag').as('6').property(single, 'name', 't3').property(single, 'label', 't').
  addV('Tag').as('7').property(single, 'name', 't4').property(single, 'label', 't').
  addE('connected').from('1').to('4').
  addE('connected').from('1').to('5').
  addE('connected').from('2').to('6').
  addE('next').from('2').to('7')
  

В следующем случае я просто использовал union() для создания двух списков — по одному для каждого «типа»:

 gremlin> g.V().has('label','l').
......1>   group().
......2>     by('name').
......3>     by(union(out("connected").limit(1).values('name').fold(),
......4>              out("next").limit(1).values('name').fold()).
......5>        fold())
==>[l1:[[t1],[]],l2:[[t3],[t4]],l3:[[],[]]]
  

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

Комментарии:

1. есть ли способ выбрать несколько типов соседей. Например: « g.V().has(‘label’,’l’). group(). by(‘name’). by(out(«oneType»).limit(1).values(‘name’).fold()). by(out(«secondType»).limit(1).values(‘name’).fold()) «