首页 > 解决方案 > Gremlin 查询返回键/值列表,其中键是顶点 ID,值是特定属性的值

问题描述

我开始学习图形数据库,并在 Gremlin 查询语言的查询中遇到了一个小障碍,以证明概念。

假设我有一个代表特定类型螺栓的顶点,并且每个属性都代表螺栓可用的材料和成本。

id: bolt-123,
label: part,
properties: [
    { steel : 0.05 },
    { aluminum : 0.02 },
    { iron : 0.03 },
    { plastic : 0.01 }
]

我希望能够获得所有由塑料制成的螺栓及其成本的清单。由于我目前对 Gremlin 的了解有限,我已经能够提出以下查询:

g.V().hasLabel('part').has('plastic').project('key', 'value').by('id').by('plastic')

这导致

[ { "key": "bolt-123", "value": 0.01 },
  { "key": "bolt-456", "value": 0.02 } ]

虽然这个查询对我来说很有意义,但我希望能把它弄平一点,这样我就可以:

[ { "bolt-123", 0.01 },
  { "bolt-456", 0.02 } ]

感谢您帮助 Gremlin 新手。

标签: azure-cosmosdbgremlin

解决方案


如果您只想要 的值,则Map可以附加select(values)到该遍历的末尾,它将删除键。我将以“现代”图表为例:

gremlin> g.V().project('k','v').by(id).by('name').select(values)
==>[1,marko]
==>[2,vadas]
==>[3,lop]
==>[4,josh]
==>[5,ripple]
==>[6,peter]

当然,如果您不需要,Map那么我一开始就不会打扰project()它,只需创建Listof 值:

gremlin> g.V().map(union(id(),values('name')).fold())
==>[1,marko]
==>[2,vadas]
==>[3,lop]
==>[4,josh]
==>[5,ripple]
==>[6,peter]

如果你想要你提供的确切输出,你可以强制Lista Mapwith group()

gremlin> g.V().
......1>   map(union(id(),values('name')).
......2>       fold().
......3>       group().
......4>         by(limit(local,1)).
......5>         by(tail(local)))
==>[1:marko]
==>[2:vadas]
==>[3:lop]
==>[4:josh]
==>[5:ripple]
==>[6:peter]

它基本上是从列表中的第一项中获取每个List项的键,然后从列表中的第二项中获取值。Maplimit(local,1)tail(local)

当然,我现在想到,如果你的“id”真的是独一无二的,那么你可以省略union()并且只是做group()

gremlin> g.V().group().by(id()).by(values('name').unfold())
==>[1:marko,2:vadas,3:lop,4:josh,5:ripple,6:peter]

请注意,我故意这样做,by(values('name').unfold())而不是by('name')因为后者会将结果包装在List.


推荐阅读