Gremlin图遍历使用先前的边属性值来过滤后边

时间:2016-10-20 22:18:47

标签: gremlin graph-traversal

在图遍历中,我只想考虑具有属性的边,该边等于遍历中前一步中访问的边之一的属性。

我发现http://tinkerpop.apache.org/docs/current/recipes/#traversal-induced-values但这似乎只适用于单个对象,在我的情况下,我需要在遍历时更改值。例如,从具有出站边缘(E1,E2,E3 ......)的V1开始,我想要将E1遍历到V2,然后沿着V2的任何边缘遍历,其中edge.property(x)== E1.property(x ),并对V1(E2,E3,...)

中的所有边做同样的事情

我无法找到任何支持在Gremlin中执行此操作的文档,是否可能?

1 个答案:

答案 0 :(得分:7)

我们可以使用TinkerPop附带的现代玩具图:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

此图表已包含6条边,其中两条边weight1.0

gremlin> g.E().valueMap()
==>[weight:0.5]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:0.2]

我们使用这两个边中的一个weight 1.0来获得具有相同weight的另一边。通过遍历这两条边中的第一条,我们降落在一个有两个外边的顶点:

gremlin> g.V(1).outE().has('weight',1.0).inV().outE()
==>e[10][4-created->5]
==>e[11][4-created->3]
gremlin> g.V(1).outE().has('weight',1.0).inV().outE().valueMap()
==>[weight:1.0]
==>[weight:0.4]

其中一条边是另一条重量为1.0的边。因此,我们只需要根据第一条边的权重过滤这些边:

gremlin> g.V(1).outE().has('weight',1.0).
                as('firstEdge'). // save the first edge
                inV().outE().
                where(eq('firstEdge')). // compare with the first edge
                by('weight') // use only the 'weight' property for the equality check
==>e[10][4-created->5]