如何使用Gremlin Cosmos DB过滤相关对象?

问题描述

我想获取一个对象的ResultSet,该对象由一个用户和尚未与此用户相关的所有用户的列表组成。 结果应如下所示:

[[user: [USEROBJECT],usersThatAreNotFriends: [[USEROBJECT]...]]...]

我正在使用Cosmos DB Gremlin端点,并努力筛选/合并已经相关的用户和所有用户

我的想法是:

g.V().hasLabel('user').as('user').flatMap(g.V().hasLabel('user').where(__.eq(select('user').out('isFriend')).fold()).as('usersThatAreNotFriends').select('user','usersThatAreNotFriends')

要设置我的示例,请使用:

g.addV('user').property('id','user_1').property('partition_key','1')
g.addV('user').property('id','user_2').property('partition_key','2')
g.addV('user').property('id','user_3').property('partition_key','3')
g.addV('user').property('id','user_4').property('partition_key','4')
g.V('user_1').addE('has_relation').to(g.V('user_2'))
g.V('user_2').addE('has_relation').to(g.V('user_1'))
g.V('user_2').addE('has_relation').to(g.V('user_4'))
g.V('user_4').addE('has_relation').to(g.V('user_2'))

预期结果应以简单的方式表示:

[user_1: [user_3,user_4],user_2:[user_3],user_3:[user_1,user_2,user_3],user_4:[user_1,user_3]]

解决方法

我修改了您的查询,以将ID添加为真实ID

g.addV('user').property(id,'user_1').property('partition_key','1')
g.addV('user').property(id,'user_2').property('partition_key','2')
g.addV('user').property(id,'user_3').property('partition_key','3')
g.addV('user').property(id,'user_4').property('partition_key','4')
g.V('user_1').addE('has_relation').to(g.V('user_2'))
g.V('user_2').addE('has_relation').to(g.V('user_1'))
g.V('user_2').addE('has_relation').to(g.V('user_4'))
g.V('user_4').addE('has_relation').to(g.V('user_2'))   

在您的示例中,有时您在结果中显示了同一个人,因此我建议使用两个不同的查询。第一个包括不与自己成为朋友的人。

gremlin> g.V().as('p').
......1>    project('person','not-friends').
......2>      by().
......3>      by(V().where(__.not(__.in('has_relation').as('p'))).fold())
==>[person:v[user_3],not-friends:[v[user_3],v[user_2],v[user_1],v[user_4]]]
==>[person:v[user_2],v[user_2]]]
==>[person:v[user_1],v[user_4]]]
==>[person:v[user_4],v[user_4]]] 

如果您想避免该人出现在结果中而不是与自己成为朋友,则可以这样做:

gremlin>  g.V().as('p').
......1>    project('person','not-friends').
......2>      by().
......3>     by(V().where(__.not(__.in('has_relation').as('p')).where(neq('p'))).fold())
==>[person:v[user_3],not-friends:[v[user_2],not-friends:[v[user_3]]]
==>[person:v[user_1],v[user_1]]]

作为发现谁是朋友的旁注,您可以使用简单的group().by()方法。

gremlin> g.V().aggregate('all').group().by().by(out().fold()).unfold()
==>v[user_3]=[]
==>v[user_2]=[v[user_1],v[user_4]]
==>v[user_1]=[v[user_2]]
==>v[user_4]=[v[user_2]]