2

有人可以帮我解决这个简单的问题吗...在此先感谢...

我正在使用以下 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)
4

2 回答 2

2

这里发生了几件事,但您需要对遍历进行的主要更新是使用 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(''))) 
于 2020-05-18T16:02:55.010 回答
1

目前你会得到很多重复的数据,在上面的查询中你会得到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

于 2020-05-18T15:58:21.297 回答