当前位置: 首页 > 知识库问答 >
问题:

如何在嵌套的Gremlin遍历中引用as变量?

鞠边浩
2023-03-14

在尝试编写仅在顶点Vo到顶点Vi之间没有现有边时匹配的遍历时(其中Vi的ID可能无法提前知道,因此必须通过遍历指定Vi)。

我进行了这个初始遍历:

<A> GraphTraversal<A, Edge> addEdge(
  GraphTraversal<A, Vertex> traversalToVo,
  String viSelectKey
) {
  return traversalToVo.coalesce(
    __.outE("Manages").and(
      __.inV().as("inV").where("inV", P.neq(viSelectKey))
      // more conditions
    ),
    __addE("Manages").to(select(viSelectKey))
  );
}

我的问题是,我不知道如何在嵌套匿名遍历中使Vi可用;我想到的一切都会导致这个错误

Neither the sideEffects, map, nor path has a Vi-key: WherePredicateStep(inV,neq(Vi))

我已经调试了对getScopeValue的调用,事实上,当我到达那里时,从未定义过Vi。

我尝试填充Vi的方法包括:

// define "Vi" in the upstream part of the query
gts.addV(...).as("Vi").V(Vo).coalesce(...)

// modeled after "Long Traversals" recipe; variable not defined afterward
gt.V(Vo).sideEffect(viTraversal.asAdmin().clone().as("Vi")).coalesce(...)

// produces a Map, and I can't apply unfold() downstream inside predicate
gt.sideEffect(viTraversal.asAdmin().clone().group("Vi"))

据我所知,这是一些作用域规则的结果,该规则将嵌套匿名遍历与作用域值分离;如何弥合这一差距,以便在遍历的上游部分定义的as变量可以从coalesce内部和何处引用?

共有2个答案

孟鹤龄
2023-03-14

这种方法似乎效率低下且令人讨厌,但确实有效。我仍然不知道为什么我可以访问组,但不能访问as。

traversalToVo.sideEffect(traversalToVi.asAdmin().clone().group("toV").by(id))
  .coalesce(
    __.outE("rel").and(
      __.inV().id().where(P.within("toV")).by().by(Column.keys),
      // other filters
    ),
    __.addE("rel").to(traversalToVi)
  )
谭成业
2023-03-14

您的第一个版本非常接近正确,但是您没有指定Vi所代表的内容。可以通过使用中间遍历V()来实现这一点。下面是如何在现代图形上完成类似的操作:

g.V(2).as('Vi').V(1).coalesce(
  __.outE("Manages").and(
    __.inV().where(P.neq("Vi"))
  ),
  __.addE("Manages").to(select("Vi"))
);

在本例中,我指定了顶点id,但您可以使用其他小精灵过滤器步骤来获得所需的结果。

 类似资料:
  • 编辑:在@Prashant回答后,我明白我的输出顺序需要保留,因此我相应地编辑了我的原始问题并重新发布。 我想从根节点(2)遍历到叶节点(1、6、8、3、11和12)。在这种遍历过程中,我希望获取连接到产品节点13(即)的节点,我希望编写一个返回1、8、9、3、11和12的查询。 @Prashant的回答: 输出 然而,我所需输出的顺序是1、8、9、3、11和12,即在每个级别上,要求选择一个子节

  • 问题内容: 我有一个嵌套的数据结构。我想使用模块读取其键和值。数据结构像下面这样。 我试图使用波纹管方式读取字典中的键,但出现错误。 码 错误 所以任何人都可以解释错误的原因以及如何遍历字典。 问题答案: 作为请求的输出,代码如下所示 代替您也可以使用,但是效率更高并且返回迭代器。 希望这可以帮助 :)

  • 我目前正在阅读《从业者图形数据指南》,并试图解决以下问题(仅用于学习目的)。以下是books movie数据集的上下文,在本例中,该数据集使用“标记”顶点、“movie”顶点和“额定”边,其额定属性为1-5。 为了练习,并扩展我对书中概念的理解,我想让所有电影都标记为“喜剧”,并计算平均NP。为此,我想将所有正(1)和中性或负(-1)评级汇总到一个列表中。然后我想把这些值的总和除以这个列表中变量的

  • 问题内容: 我试图遍历嵌套对象以检索由字符串标识的特定对象。在下面的示例对象中,标识符字符串是“ label”属性。我无法解决如何遍历树以返回适当对象的问题。任何帮助或建议,将不胜感激。 问题答案: 您可以创建像这样的递归函数来对对象进行深度优先遍历。 可以这样称呼

  • 我有一个具有两个顶点的简单图,ID为“a”和“b”。 我已将标签为“foo”的边从“a”分配给“b” 小妖精 == == 小妖精 == 我的问题是:如何沿同一条边向后移动?例如,如果一个查询遍历到一个出站顶点,那么该查询如何穿越同一条边返回到入站顶点? 我的查询如下: g、 E('04b4b9fd-2f20-751d-5673-5aa9d7ce0285').outV()。作为('outV')…[要

  • 目前,结构是一棵树,但如果有循环,上面的代码是否防止了无休止的循环?如果没有,这又怎能做到呢?