Gremlin 获取存在双向边连接的顶点

Gremlin get vertices where there exists a bidirectional edge connecting them

我的是一个简单的社交网络场景,人们可以交朋友和 post 图片,只有当它们之间存在双向关系时,这些图片才应该对人们可见

g.addV("user").property("name","X").as('x').
  addV("user").property("name","Y").as('y').
  addV("post").property("name","p1").as('p1').
  addE("posts").from("x").to("p1").
  addE("friend").from("x").to("y").iterate()

现在 X 和 Y 之间只存在单向关系。只有存在双向关系时,Y 才应该看到 X 的 posts,即

g.addE("friend").from(V().has("name","Y")).to(V().has("name","X")).iterate()

现在 X 和 Y 之间有相同类型的双向边,因此两者可以相互查看 posts。

我的代码获取 Y 的所有朋友的 posts 但不起作用

g.V("name","Y").both("friend").out("posts").toList().next();

一种更直接的写法是:

g.V().has("name","Y").as('y').
  out('friend').
  where(__.in('friend').as('y')).
  out('posts').values('name')

所以,找到"Y"并将该步骤标记为"y",然后遍历朋友,过滤掉所有"friend"不匹配回"y"的顶点使用 where() 然后对于那些匹配项获取帖子。

gremlin> g.addV("user").property("name","X").as('x').
......1>   addV("user").property("name","Y").as('y').
......2>   addV("post").property("name","p1").as('p1').
......3>   addE("posts").from("x").to("p1").
......4>   addE("friend").from("x").to("y").iterate()
gremlin> g.V().has("name","Y").as('y').
......1>   out('friend').
......2>   where(__.in('friend').as('y')).
......3>   out('posts').values('name')
gremlin> g.addE("friend").from(V().has("name","Y")).to(V().has("name","X")).iterate()
gremlin> g.V().has("name","Y").as('y').
......1>   out('friend').
......2>   where(__.in('friend').as('y')).
......3>   out('posts').values('name')
==>p1