我开始学习图形数据库,但在使用 Gremlin 查询语言进行概念验证时遇到了一个小问题。
假设我有一个代表特定类型 bolt 的顶点,每个属性代表 bolt 可用的 Material 和成本。
id: bolt-123,
label: part,
properties: [
{ steel : 0.05 },
{ aluminum : 0.02 },
{ iron : 0.03 },
{ plastic : 0.01 }
]
我希望能够获得所有塑料 bolt 的 list 及其成本。由于我目前对 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()
它,只需创建 取而代之的值列表
:
gremlin> g.V().map(union(id(),values('name')).fold())
==>[1,marko]
==>[2,vadas]
==>[3,lop]
==>[4,josh]
==>[5,ripple]
==>[6,peter]
如果你想要你呈现的准确输出,你可以使用 group()
将 List
强制转换为 Map
:
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
并使用 limit(local,1)
从列表中的第一项获取 Map
的键然后使用 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
中。
关于azure-cosmosdb - 返回键/值列表的 Gremlin 查询,其中键是顶点 ID,值是特定属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54156578/