Tinkerpop Select 邻居按他们是邻居的顶点分组,范围步长
Tinkerpop Select neighbours grouped by the vertex they are neighbour with range step
我想 select 所有 l
标记的顶点及其 t
标记的顶点由它们的邻居分组。我也想限制邻居的长度。
对于 ex for neighbor limit = 2 应该输出类似下面的内容。
[
{"l1",[t1,t2]},
{"l2",[t3]},
{"l3",[]}
]
对于 ex for neighbor limit = 1 应该输出类似下面的内容。
[
{"l1",[t1]},
{"l2",[t3]},
{"l3",[]}
]
grelify link 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')
我认为 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:[[],[]]]
但您当然可以使用其他 collection manipulation techniques 将其转化为其他形式。
我想 select 所有 l
标记的顶点及其 t
标记的顶点由它们的邻居分组。我也想限制邻居的长度。
对于 ex for neighbor limit = 2 应该输出类似下面的内容。
[
{"l1",[t1,t2]},
{"l2",[t3]},
{"l3",[]}
]
对于 ex for neighbor limit = 1 应该输出类似下面的内容。
[
{"l1",[t1]},
{"l2",[t3]},
{"l3",[]}
]
grelify link 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')
我认为 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:[[],[]]]
但您当然可以使用其他 collection manipulation techniques 将其转化为其他形式。