我尝试在类似于this question的顶点之间添加边,除了我想考虑其等式的其他不同属性外,例如使用在'x'
上具有索引的TinkerGraph:
g.addV().property("x", "1").
addV().property("x", "2").property("y", "1").
addV().property("x", "3").property("y", "2")
我正在尝试将x = y的两个边相加,以使(x=3,y=2) --link--> (x=2,y=1) --link--> (x=1)
使用类似的东西:
g.V().as("a").
V().as("b").
where(has("x", select("a").values("y"))).
addE("link").from("a").to("b")
但是此特定查询创建的边比我预期的要多(所有带有'y'
的顶点都连接到所有其他顶点)。
任何帮助形成适当的从句的人将不胜感激。
答案 0 :(得分:3)
在调试Gremlin时,有时需要删除一些步骤,以便您回顾一下管道早期部分返回的内容。请注意遍历的第一部分返回什么:
gremlin> g.V().as("a").
......1> V().as("b")
==>v[0]
==>v[2]
==>v[5]
==>v[0]
==>v[2]
==>v[5]
==>v[0]
==>v[2]
==>v[5]
您可以看到为什么最终会有更多想要的边缘。我开始用这个过滤掉其中一些:
gremlin> g.V().has('x').as('a').
......1> V().has('y').as('b').
......2> where('a',neq('b'))
==>v[2]
==>v[5]
==>v[5]
==>v[2]
您只关心具有“ a”的“ x”属性和“ b”的“ y”属性的顶点,并且由于您不希望这些顶点相互匹配,因此您也想用{ {1}}。
从那里开始,剩下的where('a',neq('b'))
子句与您所引用的问题中的子句非常相似:
where()
因此:
gremlin> g.V().has('x').as('a').
......1> V().has('y').as('b').
......2> where('a', neq('b')).
......3> where('a', eq('b')).by('x').by('y').
......4> addE('link').from('a').to('b')
==>e[8][0-link->2]
==>e[9][2-link->5]