带有顶点列表的 GroupBy 查询
GroupBy query with list of vertices
假设我想在一个 属性(或更多)上查询带有 "group-by" 的 Neptune 图,并且我也想取回顶点列表。
比方说,我想对 ("city", "age") 进行分组,并且也想获取顶点列表:
[
{"city": "SFO", "age": 29, "persons": [v[1], ...]},
{"city": "SFO", "age": 30, "persons": [v[10], v[13], ...]},
...
]
或者,取回顶点及其属性(如valueMap
):
[
{"city": "SFO", "age": 29, "persons": [[id:1,label:person,name:[marko],age:[29],city:[SFO]], ...]},
...
]
据我所知,Neptune 不支持 lambda 或变量赋值。有没有一种方法可以通过一次遍历而不使用 lambda 来做到这一点?
更新: 我能够获取顶点,但没有它们的属性(valueMap
)。
查询:
g.V().hasLabel("person").group().
by(values("city", "age").fold()).
by(fold().
match(__.as("p").unfold().values("city").as("city"),
__.as("p").unfold().values("age").as("age"),
__.as("p").fold().unfold().as("persons")).
select("city", "age", "persons")).
select(values).
next()
输出:
==>[city:SFO,age:29,persons:[v[1]]]
==>[city:SFO,age:27,persons:[v[2],v[23]]]
...
如果我理解正确的话,那么...
g.V().hasLabel("person").
group().
by(values("city", "age").fold())
...或...
g.V().hasLabel("person").
group().
by(valueMap("city", "age").by(unfold()))
... 已经为您提供了您所需要的,只是重新格式化结果。要将键和值中的映射合并在一起,您可以这样做:
g.V().hasLabel("person").
group().
by(valueMap("city", "age").by(unfold())).
unfold().
map(union(select(keys),
project("persons").
by(values)).
unfold().
group().
by(keys).
by(select(values)))
在现代玩具图上执行此操作(city
替换为 name
)将产生以下结果:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel("person").
......1> group().
......2> by(valueMap("name", "age").by(unfold())).
......3> unfold().
......4> map(union(select(keys),
......5> project("persons").
......6> by(values)).
......7> unfold().
......8> group().
......9> by(keys).
.....10> by(select(values)))
==>[persons:[v[2]],name:vadas,age:27]
==>[persons:[v[4]],name:josh,age:32]
==>[persons:[v[1]],name:marko,age:29]
==>[persons:[v[6]],name:peter,age:35]
假设我想在一个 属性(或更多)上查询带有 "group-by" 的 Neptune 图,并且我也想取回顶点列表。
比方说,我想对 ("city", "age") 进行分组,并且也想获取顶点列表:
[
{"city": "SFO", "age": 29, "persons": [v[1], ...]},
{"city": "SFO", "age": 30, "persons": [v[10], v[13], ...]},
...
]
或者,取回顶点及其属性(如valueMap
):
[
{"city": "SFO", "age": 29, "persons": [[id:1,label:person,name:[marko],age:[29],city:[SFO]], ...]},
...
]
据我所知,Neptune 不支持 lambda 或变量赋值。有没有一种方法可以通过一次遍历而不使用 lambda 来做到这一点?
更新: 我能够获取顶点,但没有它们的属性(valueMap
)。
查询:
g.V().hasLabel("person").group().
by(values("city", "age").fold()).
by(fold().
match(__.as("p").unfold().values("city").as("city"),
__.as("p").unfold().values("age").as("age"),
__.as("p").fold().unfold().as("persons")).
select("city", "age", "persons")).
select(values).
next()
输出:
==>[city:SFO,age:29,persons:[v[1]]]
==>[city:SFO,age:27,persons:[v[2],v[23]]]
...
如果我理解正确的话,那么...
g.V().hasLabel("person").
group().
by(values("city", "age").fold())
...或...
g.V().hasLabel("person").
group().
by(valueMap("city", "age").by(unfold()))
... 已经为您提供了您所需要的,只是重新格式化结果。要将键和值中的映射合并在一起,您可以这样做:
g.V().hasLabel("person").
group().
by(valueMap("city", "age").by(unfold())).
unfold().
map(union(select(keys),
project("persons").
by(values)).
unfold().
group().
by(keys).
by(select(values)))
在现代玩具图上执行此操作(city
替换为 name
)将产生以下结果:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel("person").
......1> group().
......2> by(valueMap("name", "age").by(unfold())).
......3> unfold().
......4> map(union(select(keys),
......5> project("persons").
......6> by(values)).
......7> unfold().
......8> group().
......9> by(keys).
.....10> by(select(values)))
==>[persons:[v[2]],name:vadas,age:27]
==>[persons:[v[4]],name:josh,age:32]
==>[persons:[v[1]],name:marko,age:29]
==>[persons:[v[6]],name:peter,age:35]