【问题标题】:How do I produce output even when there is no edge and when using select for projection即使没有边缘以及使用 select 进行投影,我如何产生输出
【发布时间】:2020-09-04 11:22:03
【问题描述】:

有人可以帮我解决这个简单的问题吗...非常感谢提前...

我正在使用以下 gremlin 查询,它很好地为我提供了原始顶点 (v)(id-=12345)、它的边 (e) 和子顶点(id 属性)。但是,假设原始顶点“v”(id-12345)没有出边,则查询不返回任何内容。我仍然想要原始顶点('v')的属性,即使它没有传出边和一个孩子。我该怎么做?

g.V().has('id', '12345').as('v').
  outE().as('e').
  inV().
    as('child_v').
    select('v', 'e', 'child_v').
    by(valueMap()).by(id).by(id)

【问题讨论】:

    标签: gremlin tinkerpop azure-cosmosdb-gremlinapi


    【解决方案1】:

    这里发生了一些事情,但是您需要对遍历进行的主要更新是使用 project() 步骤而不是 select()。

    select() 和 project() 步骤的相似之处在于它们都允许您格式化遍历的结果,但是它们在(至少)一个重要方面有所不同。 select() 通过允许您访问以前遍历和标记的元素(通过 as)来执行步骤。 project() 步骤允许您获取当前遍历器并将其分支以操作向前移动的输出。

    在原始遍历中,当原始 v 没有传出边时,所有遍历器都会在 outE() 步骤中被过滤掉。由于在 outE() 步骤之后没有进一步的遍历器,因此遍历的其余部分没有输入流,因此没有要返回的数据。如果您在原始 v 之后使用 project() 步骤,您可以返回原始遍历器以及返回边和事件顶点。在处理不存在外边缘的情况时,这确实会导致轻微的复杂性。 Gremlin 不处理空值,例如不存在外边,您需要使用 coalesce 语句为这些语句返回一些常量值。

    这是此遍历的功能版本:

    g.V().hasId(3).
      project('v', 'e', 'child_v').
        by(valueMap()).
        by(coalesce(outE().id(), constant(''))).
        by(coalesce(out().id(), constant(''))) 
    

    【讨论】:

    • 对问题的出色解释,但原始查询在边缘 ID 和子 ID 之间存在链接。在您给出的查询中,只会返回一条边和一个子项。即使您添加fold,您也会得到两个单独的数组。
    • 我不确定@noam621 你说的只有一个边缘和一个孩子是什么意思。您的查询(两者)以及 abaove 都使用 outE()。我知道如果父顶点有 5 条边,这些查询将返回父属性、边 ID 和每个子顶点的顶点 ID(即 5 个)。这就是 outE() 给你的 AFAIK ......谢谢
    • @nDev by 步骤“停止”在第一次遍历返回值时,所以如果你不使用每个by 中的fold 步骤,即使有5 条边只返回一条
    • 好的,我想我明白你现在在寻找什么了。您可以使用 optional() 步骤来执行此操作。看这里:gremlify.com/a7
    • @nDev 我的意思是将为每个孩子返回顶点属性。如果 Marko 有 5 个顶点连接到他,您将获得 Marko 的 valueMap 5 次...
    【解决方案2】:

    目前你会得到很多重复的数据,在上面的查询中你会得到E次的顶点属性。使用project 可能会更好:

    g.V('12345').project('v', 'children').
        by(valueMap()).
        by(outE().as('e').
          inV().as('child').
            select('e', 'child').by(id).fold())
    

    示例:https://gremlify.com/a1

    如果你这样做,你可以获得原始数据格式:

    g.V('12345').as('v').
      coalesce(
        outE().as('e').
        inV().
          as('child_v')
        select('v', 'e', 'child_v').
        by(valueMap()).by(id).by(id),
        project('v').by(valueMap())
      )
    

    示例:https://gremlify.com/a2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2022-12-01
      • 2012-04-24
      • 2015-11-24
      • 1970-01-01
      • 2019-09-14
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多