Graph / Gremlin用于社交媒体用例

时间:2018-07-14 03:20:30

标签: graph-databases gremlin tinkerpop3

考虑instagram feed场景。我想让所有追随者都“发布”所有帖子。对于这些帖子,我想知道我是否喜欢它,也想知道我关注的其他人中有哪些(如果有)。 在gremlin中获得最佳解决方案是什么(可能避免重复)?

Image for clarity

以下只是给出了USER 2“发布”的帖子。如何在同一查询中获取其他信息?

g.V().has('ID','USER 2').out('posted')

1 个答案:

答案 0 :(得分:0)

当您问有关Gremlin的问题时,尤其是这种复杂性之一,最好总是包括提供一些示例数据的Gremlin脚本,如下所示:

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()

至于答案,我可能会做这样的事情:

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')).values('id').fold()))
==>[post2:[likedBySelf:1,likedByFollowing:[3,4]],post1:[likedBySelf:0,likedByFollowing:[]]]

您找到用户,并用aggregate()将其关注者吸引到列表中。然后,您用out('posted')找到他们的帖子。要获得输出的Map结构,可以在这些“文章”上group()。第二个by()调制器使用project()来构建内部Map并基本上进行两次遍历,第一个遍历使用零或一个来表示您的布尔值,方法是进行count()并第二个返回到我们先前汇总的“关注者”列表以对其进行过滤。请注意,fold()在末尾的重要用途是将内部遍历的结果减少为列表。