KyK*_*yKo 2 gremlin azure-cosmosdb
我开始学习图形数据库,并在 Gremlin 查询语言中的查询遇到了一个小问题,以进行概念验证。
假设我有一个顶点代表特定类型的螺栓,每个属性都代表螺栓可用的材料和成本。
id: bolt-123,
label: part,
properties: [
{ steel : 0.05 },
{ aluminum : 0.02 },
{ iron : 0.03 },
{ plastic : 0.01 }
]
Run Code Online (Sandbox Code Playgroud)
我希望能够获得所有由塑料制成的螺栓及其成本的清单。由于我目前对 Gremlin 的了解有限,我已经能够提出以下查询:
g.V().hasLabel('part').has('plastic').project('key', 'value').by('id').by('plastic')
Run Code Online (Sandbox Code Playgroud)
这导致
[ { "key": "bolt-123", "value": 0.01 },
{ "key": "bolt-456", "value": 0.02 } ]
Run Code Online (Sandbox Code Playgroud)
虽然这个查询对我来说很有意义,但我希望把它弄平一点,这样我就可以:
[ { "bolt-123", 0.01 },
{ "bolt-456", 0.02 } ]
Run Code Online (Sandbox Code Playgroud)
感谢您帮助 Gremlin 新手。
如果你只想要 的值,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]
Run Code Online (Sandbox Code Playgroud)
当然,如果您不需要,Map那么我一开始就不会理会project()它,只需创建Listof 值:
gremlin> g.V().map(union(id(),values('name')).fold())
==>[1,marko]
==>[2,vadas]
==>[3,lop]
==>[4,josh]
==>[5,ripple]
==>[6,peter]
Run Code Online (Sandbox Code Playgroud)
如果您想要您提供的确切输出,您可以List将 a强制转换为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]
Run Code Online (Sandbox Code Playgroud)
它基本上List是Map从列表中的第一个项目中获取每个并获取 的键limit(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]
Run Code Online (Sandbox Code Playgroud)
请注意,我故意这样做by(values('name').unfold())而不是by('name')因为后者会将结果包装在List.
| 归档时间: |
|
| 查看次数: |
2195 次 |
| 最近记录: |