微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 as() 和 coalesce() 时 Upsert 失败

如何解决使用 as() 和 coalesce() 时 Upsert 失败

我正在尝试在 Gremlin 中创建一个 upsert 遍历。如果存在则更新边,否则添加新边。

g.V("123")
.as("user")
.V("456")
.as("post")
.inE("like")
.fold()
.coalesce(
  __.unfold()
  .property("likeCount",1),__.addE("like")
  .from("user")
  .to("post")
)

这会返回一个错误

提供的遍历器没有映射到值:[]->[SelectOnestep(last,post)]

我已将范围缩小到 to("post") 步骤。从 coalesce 内部看不到 postas("post")。它也无法看到 user

这对我来说很奇怪,因为以下确实有效:

g.V("123")
.as("user")
.V("456")
.as("post")
.choose(
  __.inE("like"),__.inE("like")
    .property("likeCount",__.addE("like")
    .from("user")
    .to("post")
)

choose() 步骤中,我确实可以访问 userpost

我想使用更高效的 upsert 模式,但无法解决这个问题。我可以像这样从 user 中查找 postcoalesce

g.V("123")
.as("user")
.V("456")
.as("post")
.inE("like")
.fold()
.coalesce(
  __.unfold()
  .property("likeCount",__.V("456")
  .as("post")
  .V("123")
  .addE("like")
  .to("post")
)

但是重复遍历似乎效率低下。由于其他原因,我需要在外部遍历中使用 postuser

在第一个示例中,为什么我不能从 user 中访问 postcoalesce

解决方法

您遇到的问题是,一旦您点击代码中的 fold() 步骤,您就会 lose the path history,这意味着它不会知道 user 或 {{1} } 所指。 post 是所谓的 ReducingBarrierStep,这意味着将许多结果收集到一个结果中。我的想法是,由于您已将许多结果转换为一个,因此添加的别名(例如 fold()user)之类的任何内容都不再真正有意义,因为它们都已被收集到一个单个元素。

但是,您可以按照此处所示重写查询以获得所需的结果:

post

我也不确定您是打算只在现有边上添加点赞数,还是想在任何一种情况下都将点赞数添加到边上,如下所示:

g.V("456")
.inE("like")
.fold()
.coalesce(
  __.unfold()
  .property("likeCount",1),__.addE("like")
  .from(V("123"))
  .to(V("456"))
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。