在遍历期间将顶点的传入边添加到集合 属性
Adding the incoming edges of a vertex to a set property during a traversal
我想做的是深度优先遍历,在每一步中我将传入边(实际上是顶点)添加到一个集合中。最终,我希望步骤中的每个节点都有一个遍历的传入顶点列表。最初我为每个传入边添加一个简单的 属性 :
g.V().has('Name', 'startnode').repeat(__.in()).emit().property('degree', union(values('degree'), constant(1)).sum())
我最终得到一个 属性 degree,它保存了传入边的计数。我现在想要一组传入边,而不仅仅是一个计数。类似于:
g.V().has('Name', 'R1\B').repeat(__.in()).emit().property(set, 'incoming', XXX)
就是那个 XXX。我需要将其设置为什么?即遍历中的当前传入顶点。
为了访问边,您需要明确地遍历它们。
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]]
我想做的是深度优先遍历,在每一步中我将传入边(实际上是顶点)添加到一个集合中。最终,我希望步骤中的每个节点都有一个遍历的传入顶点列表。最初我为每个传入边添加一个简单的 属性 :
g.V().has('Name', 'startnode').repeat(__.in()).emit().property('degree', union(values('degree'), constant(1)).sum())
我最终得到一个 属性 degree,它保存了传入边的计数。我现在想要一组传入边,而不仅仅是一个计数。类似于:
g.V().has('Name', 'R1\B').repeat(__.in()).emit().property(set, 'incoming', XXX)
就是那个 XXX。我需要将其设置为什么?即遍历中的当前传入顶点。
为了访问边,您需要明确地遍历它们。
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]]