1

我创建了一个名为的用户定义步骤otherV,它从一条边 ( e) 开始,采用单个 Vertex 参数(要么 要么e.inVe.outV,然后输出该边上的另一个顶点。

Gremlin.defineStep('otherV', [Edge, Pipe], {Vertex v -> _().bothV.filter{!v.equals(it)}})

我有g=TinkerGraphFactory.createTinkerGraph();

当我像这样传递参数顶点时,该otherV步骤会给出正确的结果:

g.v(1).bothE('knows').otherV(g.v(1)).path{it.name}{it.label}
==>[marko, knows, vadas]
==>[marko, knows, josh]

x但是,当我第一次在一个步骤中将参数 vertex 分配给一个变量(例如) sideEffect,然后x作为参数传递给我的步骤时,它会失败并显示 ERROR No such property: x for class: groovysh_evaluate

g.v(1).sideEffect{marko=it}.bothE('knows').otherV(marko).path{it.name}{it.label}
No such property: marko for class: groovysh_evaluate

我做错了什么?


otherV这是自定义步骤应该如何工作的简单说明:

// g is the TinkerGraph
marko = g.v(1); vadas = g.v(2); 
edge = g.e(7); // e[7][1-knows->2]

gremlin> edge.otherV(marko).map
==>{name=vadas, age=27}

gremlin> edge.otherV(vadas).map
==>{name=marko, age=29}
4

1 回答 1

1

看起来问题与闭包内变量的范围有关。我已经重组了你的 defineStep 以希望能捕捉到你所追求的:

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                                                                     
==>tinkergraph[vertices:6 edges:6]
gremlin> Gremlin.defineStep('otherV', [Vertex, Pipe], {l -> _().sideEffect{x=it}.bothE(l).bothV.filter{!x.equals(it)}})                          
==>null
gremlin> g.v(1).otherV("knows").path{it.name}{it.label}
==>[marko, knows, vadas]
==>[marko, knows, josh]

这似乎也是一种更简洁的方式来定义您的自定义步骤。


这是 otherV 步骤的另一种方法,它采用任意边并输出另一个顶点:

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                  
==>tinkergraph[vertices:6 edges:6]
gremlin> Gremlin.defineStep('otherV', [Edge, Pipe], {v -> l=[v];_().bothV.except(l).gather.transform{it.size()>1?null:it[0]}})
==>null
gremlin> g.e(11).otherV(g.v(3))
==>v[4]
gremlin> g.e(11).otherV(g.v(4))
==>v[3]
gremlin> g.e(11).otherV(g.v(5))
==>null

有人可能会想出一个更好的方法来做到这一点,但基本上我意识到仅仅评估 defineStep 中来自 bothV 的顶点是否与传入的相反是不够的,因为它可能既不匹配头部也不匹配尾巴。基本上,我使用 except() 来获取传入的顶点的相反顶点,然后将不匹配的任何内容收集到列表中,然后检查列表以查看大小是否大于 1。如果是,则表示传入的顶点既不在边的头部也不在尾部(我返回 null),否则列表中的单个顶点是相反的顶点。

于 2012-12-12T11:58:02.500 回答