如何按属性列表内容对顶点分组

时间:2019-06-04 08:41:23

标签: gremlin

在我的图形中,我的顶点包含一个具有列表基数的属性。我想按列表的内容对这些顶点进行分组。

在此示例图中:

graph = TinkerGraph.open()
g = graph.traversal()
g.addV().
  property('name', 'v1').
  property(list, 'label', 'A').
  property(list, 'label', 'B')
g.addV().
  property('name', 'v2').
  property(list, 'label', 'B').
  property(list, 'label', 'C')

我已经尝试过该查询

g.V().group().by(properties('label')).by('name').unfold()
==>vp[label->A]=[v1]
==>vp[label->B]=[v2]

但这是我期望的:A=[v1],B=[v1,v2],C=[v2]

1 个答案:

答案 0 :(得分:1)

可能会有更好的方法,但这是一个选择:

gremlin> g.V().as('a').properties('label').
......1>   group().
......2>     by(value()).
......3>     by(select('a').by('name').fold()).
......4>   unfold()
==>A=[v1]
==>B=[v1, v2]
==>C=[v2]

我认为您需要将所有properties()迭代到group()中,但是问题在于无法通过Gremlin将父顶点引用到该属性。使用lambda看起来更好一些:

gremlin> g.V().properties('label').group().by(value()).by({it.element().value('name')}).unfold()
==>A=[v1]
==>B=[v1, v2]
==>C=[v2]

但是TinkerPop倾向于不推荐这种方法,因为它会降低代码的可移植性。