Graph/Gremlin 查询社交媒体用例
Graph/Gremlin query for social media use case
我的是社交网络类场景。我想获得我关注的人的所有 posts 'posted'。对于这些 post 中的每一个,我想知道我是否喜欢它以及 post 拥有的喜欢和评论的数量(仅计数)以及所有属性和所有的最新 3 条评论评论用户的属性,如他的名字等。在 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').
addV('comment').property('id','c1').property('text','hi').as('c1').
addV('comment').property('id','c2').property('text','nice').as('c2').
addV('comment').property('id','c3').property('text','hello').as('c3').
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').
addE('commented').from('1').to('c1').
addE('comments').from('c1').to('p1').
addE('commented').from('2').to('c2').
addE('comments').from('c2').to('p2').iterate()
commented
边应该有一个时间戳 属性,这就是为什么下面的查询仍然有待办事项,但我想你应该很容易自己弄清楚剩下的部分。
g.V().has('user','id',1).as('me').
out('follow').as('friend').
out('posted').as('post'). /* all the posts 'posted' by the people I follow */
project('friend','post','liked','likes','comments','latest').
by(select('friend')).
by(select('post').by('postId')).
by(coalesce(__.in('liked').where(eq('me')).constant('yes'),
constant('no'))). /* whether I have liked it or not */
by(inE('liked').count()). /* no of likes */
by(inE('comments').count()). /* comments that post have(only count) */
by(__.in('comments').as('comment'). /* todo: order by time desc */
in('commented').as('user').limit(3). /* latest 3 comments */
select('comment','user').
by(valueMap()). /* with all properties */
fold())
示例图的结果:
==>[friend:v[2],post:post1,liked:no,likes:0,comments:1,latest:[[comment:[id:[c1],text:[hi]],user:[id:[1]]]]]
==>[friend:v[2],post:post2,liked:yes,likes:3,comments:1,latest:[[comment:[id:[c2],text:[nice]],user:[id:[2]]]]]
我的是社交网络类场景。我想获得我关注的人的所有 posts 'posted'。对于这些 post 中的每一个,我想知道我是否喜欢它以及 post 拥有的喜欢和评论的数量(仅计数)以及所有属性和所有的最新 3 条评论评论用户的属性,如他的名字等。在 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').
addV('comment').property('id','c1').property('text','hi').as('c1').
addV('comment').property('id','c2').property('text','nice').as('c2').
addV('comment').property('id','c3').property('text','hello').as('c3').
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').
addE('commented').from('1').to('c1').
addE('comments').from('c1').to('p1').
addE('commented').from('2').to('c2').
addE('comments').from('c2').to('p2').iterate()
commented
边应该有一个时间戳 属性,这就是为什么下面的查询仍然有待办事项,但我想你应该很容易自己弄清楚剩下的部分。
g.V().has('user','id',1).as('me').
out('follow').as('friend').
out('posted').as('post'). /* all the posts 'posted' by the people I follow */
project('friend','post','liked','likes','comments','latest').
by(select('friend')).
by(select('post').by('postId')).
by(coalesce(__.in('liked').where(eq('me')).constant('yes'),
constant('no'))). /* whether I have liked it or not */
by(inE('liked').count()). /* no of likes */
by(inE('comments').count()). /* comments that post have(only count) */
by(__.in('comments').as('comment'). /* todo: order by time desc */
in('commented').as('user').limit(3). /* latest 3 comments */
select('comment','user').
by(valueMap()). /* with all properties */
fold())
示例图的结果:
==>[friend:v[2],post:post1,liked:no,likes:0,comments:1,latest:[[comment:[id:[c1],text:[hi]],user:[id:[1]]]]]
==>[friend:v[2],post:post2,liked:yes,likes:3,comments:1,latest:[[comment:[id:[c2],text:[nice]],user:[id:[2]]]]]