azure-cosmosdb - 返回键/值列表的 Gremlin 查询,其中键是顶点 ID,值是特定属性的值

标签 azure-cosmosdb gremlin

我开始学习图形数据库,但在使用 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/

相关文章:

Gremlin:查找一组中与另一组有连接的所有节点

titan - Gremlin 查询通过跨多个顶点属性的搜索键进行搜索

azure - 在运行 az cosmosdb create 命令创建 Cosmos DB 帐户时,如何指定 MongoDB API 版本?

Azure CosmosDB - 分区键达到最大大小 10 GB

gremlin - gremlin_python 中的批量更新插入失败,出现 "TypeError: ' GraphTraversal' 对象不可调用”

lucene - Gremlin + Neo4j Lucene 搜索

java - 如何为嵌入式 Neo4j 数据库执行 Gremlin 脚本?

azure - 对 DocumentDB 定价感到困惑

c# - 在 C# 中针对没有 Skip 的 DocumentDB 进行分页

azure - 从 CosmosDB 的集合中读取所有分区的文档