azure-cosmosdb - 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 新手。
解决方案
如果您只想要 的值,则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()
它,只需创建List
of 值:
gremlin> g.V().map(union(id(),values('name')).fold())
==>[1,marko]
==>[2,vadas]
==>[3,lop]
==>[4,josh]
==>[5,ripple]
==>[6,peter]
如果你想要你提供的确切输出,你可以强制List
a Map
with 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
项的键,然后从列表中的第二项中获取值。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]
请注意,我故意这样做,by(values('name').unfold())
而不是by('name')
因为后者会将结果包装在List
.
推荐阅读
- reactjs - 反应docker nginx kubernetes 404
- tcl - 如何将目录中的第一个文件设置为 TCL 中的变量?
- c++11 - C++ 声明和初始化/变量未初始化为默认值
- python - Python:如果满足/不满足条件,需要停止运行代码
- dart - 我怎样才能要求一个类在 Dart 中有 fromJson?
- php - 'PHP 消息:PHP 警告:未定义的数组键“lastpage”问题
- c - 动态分配二维数组时出现分段错误(核心转储)
- vagrant - 每当命令 Vagrant up 时,Vagrant 都找不到该框
- php - 在没有请求的情况下自动删除php中的文件
- c++ - OpenCL 结果随不相关的任意代码更改而更改