使用属性在顶点之间添加边

时间:2019-01-21 17:08:13

标签: tinkerpop

我尝试在类似于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'的顶点都连接到所有其他顶点)。

任何帮助形成适当的从句的人将不胜感激。

1 个答案:

答案 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]