【问题标题】:Gremlin's valueMap() returns an empty object with JS and NeptuneGremlin 的 valueMap() 返回一个带有 JS 和 Neptune 的空对象
【发布时间】:2021-07-28 00:11:58
【问题描述】:

我正在尝试使用 gremlin 和具有特定标签的 js 获取所有节点及其属性。

它应该输出如下内容:

[
  { 
    p1:v1,
    p2:v2,
    px:vx
  },
  { 
    p1:v1,
    p2:v2,
    px:vx
  }
]

我现在尝试了一百万件事,但我认为它应该可以工作:

g.V().hasLabel("myLabel").valueMap();

g.V().hasLabel("myLabel").map(p.valueMap()).toList();

但他们都回来了

[
  {},
  {}
]

我不明白,因为如果我这样做:

g.V().hasLabel("myLabel").map(p.values().fold()).toList();

我得到了一个我想要的列表,但只有值。

【问题讨论】:

  • 假设有带有该标签的顶点,那么您需要做的就是g.V().hasLabel("myLabel").valueMap().next(),但您还需要await 在使用Node/Javascript 客户端时返回该查询。这会产生任何结果吗?
  • @KelvinLawrence 我这样问:return await g.V().hasLabel("myLabel").valueMap().next(); 得到回复:{"value": null, "done": true}。为了清楚起见,数据库中有我的标签的顶点
  • @KelvinLawrence 在没有.next() 的情况下尝试过,我得到[["V"],["hasLabel","myLabel"],["valueMap"]] 作为回应。还尝试在TinkerFactory.createModern() 测试数据库上使用person 标签进行相同的查询,它按预期工作¿这可能是Gremlin + Neptune 的错误吗?
  • 如果没有.next(),您实际上并没有将查询发送到 Neptune,因为没有“终端”步骤。您所看到的只是当您添加 next() 时将发送到 Neptune 的查询字节码。您使用的是哪个版本的 Gremlin JS 客户端?另外,您的应用程序代码在哪里运行?如果它在 Lambda 函数中,则 Gremlin 客户端可能存在已知问题,我可以建议解决方法。
  • @KelvinLawrence 是的,我在 lambda 上运行。它的版本3.5.1

标签: javascript gremlin gremlinjs


【解决方案1】:

原来 Gremlin 返回的是 Map 而不是 Object,因此我需要将响应转换为对象才能使用它。

这是我的做法:

const response = await g.V().hasLabel("myLabel").local(p.properties().group().by(p.key()).by(p.value())).toList();
const asObject = response.map(val=>Object.fromEntries(val));

我还选择了local 而不是valueMap(),因为最后一个会将值作为数组而不是实际值返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2014-04-28
    • 2018-11-08
    • 1970-01-01
    • 2023-03-14
    • 2021-10-13
    相关资源
    最近更新 更多