#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()) «