【问题标题】:How to check equality with nodes from an earlier part of query in Gremlin?如何检查 Gremlin 中早期查询部分的节点是否相等?
【发布时间】:2022-01-04 10:35:17
【问题描述】:

考虑下图:

我想找到所有他们之间有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 中实现这一目标?

【问题讨论】:

    标签: gremlin


    【解决方案1】:

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

    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] 
    

    【讨论】:

    • 谢谢,这行得通。我认为使用下划线来避免 gremlin 功能与内置语言冲突。如果是这样,您能告诉我为什么在使用控制台时需要下划线吗?
    • Gremlin 控制台位于 Groovy 控制台之上 - 这是为了避免与 Groovy 的保留字冲突(因为 Groovy 将尝试解析输入的内容)
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多