Graph/Gremlin 用于社交媒体用例
Graph/Gremlin for social media use case
考虑 instagram 提要场景。我想获得我关注的人的所有帖子 'posted'。对于这些帖子中的每一个,我都想知道我是否喜欢它,并且还想知道我关注的其他哪些人喜欢它(如果有的话)。 在 gremlin 中得到这个的最佳解决方案是什么(可能避免重复)?
Image for clarity
下面只给出USER 2的帖子'posted'。如何在同一个查询中获取其他信息?
g.V().has('ID','USER 2').out('posted')
当您询问有关 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()
在那些 "posts" 上。第二个 by()
调制器使用 project()
来构建你的内部 Map
并且基本上进行两次遍历,其中第一个使用零或一个来表示你的布尔值,方法是 count()
和第二个返回到我们之前聚合的 "followers" 列表以过滤那些。请注意最后 fold()
的重要用途,以减少内部遍历到列表的结果。
考虑 instagram 提要场景。我想获得我关注的人的所有帖子 'posted'。对于这些帖子中的每一个,我都想知道我是否喜欢它,并且还想知道我关注的其他哪些人喜欢它(如果有的话)。 在 gremlin 中得到这个的最佳解决方案是什么(可能避免重复)?
Image for clarity
下面只给出USER 2的帖子'posted'。如何在同一个查询中获取其他信息?
g.V().has('ID','USER 2').out('posted')
当您询问有关 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()
在那些 "posts" 上。第二个 by()
调制器使用 project()
来构建你的内部 Map
并且基本上进行两次遍历,其中第一个使用零或一个来表示你的布尔值,方法是 count()
和第二个返回到我们之前聚合的 "followers" 列表以过滤那些。请注意最后 fold()
的重要用途,以减少内部遍历到列表的结果。