【问题标题】:Gremlin - Choose one item at randomGremlin - 随机选择一项
【发布时间】:2018-12-25 13:33:34
【问题描述】:

将我视为“用户” 1. 查询的目的是获取我关注的人“发布”的帖子,并检查每个帖子:

  1. 我是否喜欢过它
  2. 我关注的其他人是否喜欢它,如果是,随机选择其中一位用户返回

样本数据:

g.addV('user').property('id',1).as('1')
  addV('user').property('id',2).as('2').
  addV('user').property('id',3).as('3').
  addV('user').property('id',4).as('4').
  addV('post').property('postId','post1').as('p1').
  addV('post').property('postId','post2').as('p2').
  addE('follow').from('1').to('2').
  addE('follow').from('1').to('3').
  addE('follow').from('1').to('4').
  addE('posted').from('2').to('p1').
  addE('posted').from('2').to('p2').
  addE('liked').from('1').to('p2').
  addE('liked').from('3').to('p2').
  addE('liked').from('4').to('p2').iterate()

查询:(在这里回答:Graph/Gremlin for social media use caseg.V().has('id',1).as('me').out('follow').aggregate('followers').out('posted').group().by('postId').by(project('likedBySelf','likedByFollowing').by(__.in('liked').where(eq('me')).count()).by(__.in('liked').where(within('followers')).order().by(shuffle).values('id').fold()))

输出:

[post1:[likedBySelf:0,likedByFollowing:[]],post2:[likedBySelf:1,likedByFollowing:[4,3]]]

这个查询能够打乱值,但显示所有的 'id',现在我只想选择第一个 'id'。使用 .next() 而不是 .fold() 会导致异常 java.util.NoSuchElementException 是否可以随机选择而不必先评估所有遍历然后打乱它们?

期望的输出:

[post1:[likedBySelf:0,likedByFollowing:[]],post2:[likedBySelf:1,likedByFollowing:[3]]]

或者

[post1:[likedBySelf:0,likedByFollowing:[]],post2:[likedBySelf:1,likedByFollowing:[4]]]

【问题讨论】:

    标签: gremlin tinkerpop


    【解决方案1】:

    你已经很接近你的答案了:

    gremlin> g = TinkerGraph.open().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
    gremlin> g.addV('user').property('id',1).as('1').
    ......1>   addV('user').property('id',2).as('2').
    ......2>   addV('user').property('id',3).as('3').
    ......3>   addV('user').property('id',4).as('4').
    ......4>   addV('post').property('postId','post1').as('p1').
    ......5>   addV('post').property('postId','post2').as('p2').
    ......6>   addE('follow').from('1').to('2').
    ......7>   addE('follow').from('1').to('3').
    ......8>   addE('follow').from('1').to('4').
    ......9>   addE('posted').from('2').to('p1').
    .....10>   addE('posted').from('2').to('p2').
    .....11>   addE('liked').from('1').to('p2').
    .....12>   addE('liked').from('3').to('p2').
    .....13>   addE('liked').from('4').to('p2').iterate()
    gremlin> g.V().has('id',1).as('me').
    ......1>   out('follow').
    ......2>   aggregate('followers').
    ......3>   out('posted').
    ......4>   group().
    ......5>     by('postId').
    ......6>     by(project('likedBySelf','likedByFollowing').
    ......7>          by(__.in('liked').where(eq('me')).count()).
    ......8>          by(__.in('liked').where(within('followers')).order().by('id',shuffle).values('id').limit(1).fold()))
    ==>[post2:[likedBySelf:1,likedByFollowing:[3]],post1:[likedBySelf:0,likedByFollowing:[]]]
    

    我几乎只是添加了limit(1),因此只选择了shuffle 之后的第一项。执行了几次,但我能够使用此方法看到您正在寻找的两个输出。正如我在您的其他问题上所建议的,您也可以使用sample(1)

    gremlin> g.V().has('id',1).as('me').
    ......1>   out('follow').
    ......2>   aggregate('followers').
    ......3>   out('posted').
    ......4>   group().
    ......5>     by('postId').
    ......6>     by(project('likedBySelf','likedByFollowing').
    ......7>          by(__.in('liked').where(eq('me')).count()).
    ......8>          by(__.in('liked').where(within('followers')).sample(1).values('id').fold()))
    ==>[post2:[likedBySelf:1,likedByFollowing:[3]],post1:[likedBySelf:0,likedByFollowing:[]]]
    gremlin> g.V().has('id',1).as('me').
    ......1>   out('follow').
    ......2>   aggregate('followers').
    ......3>   out('posted').
    ......4>   group().
    ......5>     by('postId').
    ......6>     by(project('likedBySelf','likedByFollowing').
    ......7>          by(__.in('liked').where(eq('me')).count()).
    ......8>          by(__.in('liked').where(within('followers')).sample(1).values('id').fold()))
    ==>[post2:[likedBySelf:1,likedByFollowing:[4]],post1:[likedBySelf:0,likedByFollowing:[]]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多