如何检查与 Gremlin 早期查询部分的节点是否相等?

How to check equality with nodes from an earlier part of query in Gremlin?

考虑下图:

我想找到他们之间有 FOLLOWS 关系并且评论过同一部电影的所有成对的人。在 Cypher 中,我会执行以下操作:

MATCH (p:Person) -[:REVIEWED]-> (m:Movie)
MATCH (p) -[:FOLLOWS]-> (p2:Person)
MATCH (p2) -[:REVIEWED]-> (m)
RETURN p, p2, m

我目前在 Gremlin 中拥有的内容:

g.V().hasLabel('person').as('p')
 .out('REVIEWED').as('m')
 .in('REVIEWED').as('p2')
 .where(in('FOLLOWS').is(select('p')))   // this doesn't work
 .select('p', 'm', 'p2')

但这行不通。我怎样才能在 Gremlin 中实现这一目标?

其实你们很亲近。试试这个

g.V().hasLabel('person').as('p')
 .out('REVIEWED').as('m')
 .in('REVIEWED').as('p2')
 .where(in('FOLLOWS').as('p'))  
 .select('p', 'm', 'p2')

我们可以使用这个简单的图来测试查询

g.addV('Person').property('name','P1').as('p1').
  addV('Person').property('name','P2').as('p2').
  addV('Person').property('name','P3').as('p3').
  addV('Movie').property('name','Shrek').as('m1').
  addE('REVIEWED').from('p1').to('m1').
  addE('REVIEWED').from('p2').to('m1').
  addE('REVIEWED').from('p3').to('m1').
  addE('FOLLOWS').from('p1').to('p3') 

我们可以看到它使用 Gremlin 控制台工作

gremlin> g.V().hasLabel('Person').as('p').
......1>       out('REVIEWED').as('m').
......2>       in('REVIEWED').as('p2').
......3>       where(__.in('FOLLOWS').as('p')).
......4>       select('p', 'm', 'p2').by('name')

==>[p:P1,m:Shrek,p2:P3]