在我的图形中,我的顶点包含一个具有列表基数的属性。我想按列表的内容对这些顶点进行分组。
在此示例图中:
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]
答案 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倾向于不推荐这种方法,因为它会降低代码的可移植性。