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

Gremlin中单次遍历中顶点和边的插入

窦国源
2023-03-14

我花了几个小时试图写一个小精灵语句来处理在它们之间插入两个顶点和一条边,但运气不太好。

在伪gremlin中,我想做的事情非常简单,如下所示:

g.V()
.hasLabel("person")
.has("custom_id", "123")
.fold()
.coalesce(
  __.unfold().property(single, "name", "Tom"), 
  __.addV("person").property(single, "custom_id", "123").property(single, "name", "Tom"))
.as("fromStep")
.V()
.hasLabel("person")
.has("custom_id", "654")
.fold()
.coalesce(
  __.unfold().property(single, "name", "Sally"),
  __.addV("person").property(single, "custom_id", "654").property(single, "name", "Sally"))
.as("toStep")
.E()
.hasLabel("knows")
.where(__.inV().is("fromStep"))
.where(__.outV().is("toStep"))
.fold()
.coalesce(
  __.unfold().property("since", "2020-01-01"),
  __.addE("knows").property("since", "2020-01-01").from("fromStep").to("toStep")

此代码的问题是每个折叠步骤,作为屏障步骤“删除”前面作为步骤的值。

有没有办法在一个声明中正确地做到这一点?

感谢开尔文的回答,这里是解决方案:)

g.V()
.hasLabel("person")
.has("custom_id", "123")
.fold()
.coalesce(
    __.unfold().property(single, "name", "Tom"), 
    __.addV("person").property(single, "custom_id", "123").property(single, "name", "Tom"))
.store("a")
.V()
.hasLabel("person")
.has("custom_id", "654")
.fold()
.coalesce(
    __.unfold().property(single, "name", "Sally"),
    __.addV("person").property(single, "custom_id", "654").property(single, "name", "Sally"))
.store("b")
.fold()
.select("a").unfold().as("from")
.select("b").unfold().coalesce(
    __.inE("knows").where(__.outV().as("from")).property("since", "2020-01-01"),
    __.addE("knows").property("since", "2020-01-01").from("from")
)

共有1个答案

姜乐语
2023-03-14

如您所述,在使用类似折叠的障碍物/地图步骤后,使用As步骤应用的标签将丢失。然而,存储集和聚合集将完好无损地保存下来。这里有一个简单的模式,在折叠后工作,您应该能够适应您的用例。正如我们在评论中所讨论的那样,如果您知道要搜索的顶点的ID,并且没有找到ID,那么您可以创建它,这将为您提供另一种方法。无论如何,这里有一种方法可以在存在折叠的情况下工作。

gremlin> g.V('3').store('a').
......1>   V('4').store('b').
......2>   fold().
......3>   select('a').unfold().as('from').
......4>   select('b').unfold().as('to').
......5>   addE('test').
......6>     from('from').
......7>     to('to')    

==>e[60876][3-test->4] 

另一个注意事项是,通常不支持中间遍历步骤。它确实应该写成V()。outE()

 类似资料:
  • 我有一个顶点上插工作和一个边缘上插工作在2个单独的遍历中。是否可以将2合并为1遍历?我尝试过,但收到错误。 a=自身g.V()。has('account',id',account-111111111').fold().coalesce(.unfold(),.addV('account').property(T.id,'account-111111111'))。has('customer','id'

  • 我有以下图表 如果我写一个查询g.V('a')。Out(),我如何才能得到被遍历的边和在traveral中遇到的顶点的值?

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

  • 我试图找到一个高效的gremlin查询,它返回顶点和输出边数的遍历。或者更好的是,如果存在或不存在传出边,则使用布尔值代替传出边的数量。 我的第一次尝试是: 第二个想法是: 两者似乎都有效,但是否有更好的解决方案,不需要底层图实现来获取或计数所有边? (我们目前在Postgresql中使用Tinkerpop/Gremlin的sqlg实现,这两个查询似乎都从Postgresql中获取所有传出的边缘。

  • 我试图使用Gremlin从一个起始节点向外遍历到连接X度内的所有连接节点。连接的方向无关紧要,所以我使用了函数。我还希望能够防止遍历与特定标签相交。这是一个示例图。 到目前为止,我进行的遍历如下所示: 然而,这并不是我所寻找的。我想要一些实际上可以防止遍历者在必须跨越指定边缘时触及顶点的东西。我当前的实现过滤具有传入边缘的顶点,但在某些情况下,如果遍历者跨越不同的边缘到达那里,我可能仍然希望该顶点

  • 我有图表(见下图)。我使用A中的gremlin,需要沿着边缘“impacts”和“Similato”循环所有树。 所以我需要这样的东西: 此查询的问题是,关系“相似”有时可能是边缘外,有时可能是边缘内(见图),这取决于应用程序当前存储数据的方式。我不能简单地使用“两者”(g. v(A. id).都('影响','相似')...)来检索边,因为另一方面,我只需要“影响”关系的边缘。也有可能,某些顶点缺