如何解决使用 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
内部看不到 post
的 as("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()
步骤中,我确实可以访问 user
和 post
。
我想使用更高效的 upsert 模式,但无法解决这个问题。我可以像这样从 user
中查找 post
和 coalesce
:
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")
)
但是重复遍历似乎效率低下。由于其他原因,我需要在外部遍历中使用 post
和 user
。
在第一个示例中,为什么我不能从 user
中访问 post
和 coalesce
?
解决方法
您遇到的问题是,一旦您点击代码中的 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 举报,一经查实,本站将立刻删除。