我正在使用 Gremlin 查询,并遇到基于指定页面大小的意外行为。当我将页面大小设置为大于 1 时,查询会按预期返回 groups 键下的组映射数组:
{
"count": 2,
"groups": [
{
"admin_team_ids": ["xxx"],
"created_at": "2024-02-28T23:19:01Z",
...
},
{
"admin_team_ids": ["xxx"],
"created_at": "2024-02-28T23:19:01Z",
...
}
]
}
但是,当我将页面大小更改为 1 时,结构发生了变化,并且 groups 键后面是单个映射而不是数组:
{
"count": 2,
"groups": {
"admin_team_ids": ["xxx"],
"created_at": "2024-02-28T23:16:37Z",
...
}
}
我不确定 Gremlin 查询的哪一部分导致了此行为。这是查询的片段(pageSize=1;要将其更改为大于 1,只需更新下面片段中的“1”):
g.V('fcc6f904-d849-8293-f5c4-5c121e8e37df').
outE('test-edge').inV().hasLabel('group').
order().by('name', asc).
valueMap().with(WithOptions.tokens).
fold().as('groups', 'count').select('groups', 'count').by(range(local, 0, 1)).by(count(local))
(我正在尝试获取特定顶点的直接传出顶点,并带有分页)
这是 Gremlin 查询的已知行为,还是与结果的处理方式有关?如何确保 groups 键始终返回一个数组,无论页面大小如何?
这在技术上并没有阻碍我们,因为我们可以在页面大小为1时进行一些特殊的条件检查,但只是想知道处理这种情况的最佳方法。预先感谢您的任何见解!
考虑到如果有多个值,Gremlin 将创建一个列表结果,但如果只有一个值,则仅返回该值,处理此问题的最简单方法可能是使用类似
unfold().fold()
的内容结束查询。如果只有一个结果,unfold
将不执行任何操作,但如果有多个结果,则将删除列表。然后,fold
将保证所有结果都返回到列表中。
这是一个简单的例子来说明它是如何工作的
gremlin> g.V()
==>v[0]
==>v[1]
gremlin> g.V().fold().limit(local,1)
==>v[0]
gremlin> g.V().fold().limit(local,2)
==>[v[0],v[1]]
gremlin> g.V().fold().limit(local,1).unfold().fold()
==>[v[0]]
gremlin> g.V().fold().limit(local,2).unfold().fold()
==>[v[0],v[1]]