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

在coalesce() 步骤中使用select() 进行gremlin 查询

如何解决在coalesce() 步骤中使用select() 进行gremlin 查询

我正在尝试在 coalesce() 内的第二次遍历中使用 .as() 访问先前保存的遍历,如下所示:

查询更新插入边(如果存在/创建则更新边)

Java 代码

g.V('x').as('start')
 .V('y').as('stop')
.inE('label').where(outV().as('edge'))
.select('start','stop','edge').fold()
.coalesce(unfold(),addE('label').from(select('start')).to(select('stop')))
.property('key','value')
.promise(Traversal::Next);

抛出错误如下:(为简洁起见)

gremlin.driver.exception.ResponseException: 提供的遍历器未映射到值 [停止]

当我将最后一步替换为下面它的工作正常(而不是别名再次查询顶点)

已替换 addE('label').from(select('start')).to(select('stop'))

带有addE('label').from(V('x')).to(V('y'))

在coalesce 中的第二次遍历中无论如何要引用别名吗?

注意:我正在收集与在合并之前查找边相关的所有数据以便在创建边时在任何顶点/顶点丢失时使小鬼抛出错误

预期行为:成功交易时为真,创建边时任何顶点丢失时出错。

这在不使用 as() 别名的情况下按预期工作。但是,我正在尝试使用 as()。我做不到。

希望这很清楚。如果需要更多信息,请发表评论。谢谢。

解决方法

您不能选择标签“开始”和“停止”的原因是您在定义它们后使用了 fold()fold() 是一个 reducing barrier step,它会导致在它之前定义的所有标签丢失。

在我解释解决方案之前,这里是将两个测试顶点相加的遍历。

g.addV().property(id,'x').
  addV().property(id,'y')

如果缺少任何顶点 'x' 或 'y',以下遍历将返回字符串 'error'。如果两个顶点都存在,则向上插入边(如果存在则更新边,如果不存在则添加它)。

g.inject(1).
  optional(V('x').as('start')).
  choose(
    select('start'),optional(V('y').as('stop')).
    choose(
      select('stop'),coalesce(
        select('start').outE('label').as('e').inV().where(eq('stop')).select('e'),addE('label').from('start').to('stop')).
        property('key','value'),constant('error')),constant('error'))

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