在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'))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...