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

在遍历期间将顶点的传入边添加到集合特性

贝浩歌
2023-03-14

我想做的是深度优先遍历,在每一步中,我将传入边(实际上是顶点)添加到一个集合中。最终,我希望步骤中的每个节点都有一个已遍历的传入顶点列表。最初,我为每个传入边的简单属性添加一个:

g.V().has('Name', 'startnode').repeat(__.in()).emit().property('degree', union(values('degree'), constant(1)).sum())

我最终得到一个包含传入边计数的属性度。我现在想要一组传入边,而不仅仅是一个计数。类似于:

g.V().has('Name', 'R1\\B').repeat(__.in()).emit().property(set, 'incoming', XXX)

是那个XXX。我需要将其设置为什么?即遍历中当前传入的顶点。

共有1个答案

汤洋
2023-03-14

为了访问边缘,需要明确地遍历它们。

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel('software').
           repeat(__.inE().as('e').outV()).
             emit().
           property(set, 'incoming', select(last, 'e')).iterate()
gremlin> g.V().valueMap()
==>[incoming:[e[9][1-created->3],e[8][1-knows->4]],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[e[11][4-created->3],e[10][4-created->5]],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[e[12][6-created->3]],name:[peter],age:[35]]

但我不建议存储整个边缘;边缘ID可能很好。

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel('software').
           repeat(__.inE().as('e').outV()).
             emit().
           property(set, 'incoming', select(last, 'e').by(id)).iterate()
gremlin> g.V().valueMap()
==>[incoming:[9,8],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[11,10],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[12],name:[peter],age:[35]]

更新

要收集相邻顶点ID,需要:

gremlin> g.V().hasLabel('software').
           repeat(__.as('v').in()).
             emit().
           property(set, 'incoming', select(last, 'v').by(id)).iterate()
gremlin> g.V().valueMap()
==>[incoming:[3,4],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[3,5],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[3],name:[peter],age:[35]]
 类似资料:
  • 我花了几个小时试图写一个小精灵语句来处理在它们之间插入两个顶点和一条边,但运气不太好。 在伪gremlin中,我想做的事情非常简单,如下所示: 此代码的问题是每个步骤,作为屏障步骤“删除”前面步骤的值。 有没有办法在一个声明中正确地做到这一点? 感谢开尔文的回答,这里是解决方案:)

  • 我有一个顶点上插工作和一个边缘上插工作在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中遇到的顶点的值?

  • 问题内容: 在迭代集合时是否可以向集合中添加元素? 更具体地说,我想遍历一个集合,如果一个元素满足特定条件,我想向集合中添加一些其他元素,并确保也对这些添加的元素进行遍历。(我意识到这可能会导致循环终止,但是我很确定不会发生这种情况。) Sun 的Java教程建议不可能:“请注意,这是在迭代过程中修改集合的唯一安全方法;如果在迭代进行过程中对基础集合进行了其他任何修改,则行为未指定。” 因此,如果