求助:如何用GraphQL+-查询两人共同好友?需实现图交集操作
解决GraphQL+-中两人共同好友的交集查询问题
嘿,我懂你现在的困扰——分开查两个人的好友列表很简单,但要取交集就卡壳了对吧?在Dgraph的GraphQL+-里,我们可以用变量存储集合或者嵌套过滤+@cascade这两种方式来实现,下面给你详细拆解:
方法一:用变量存储好友UID,再取交集
这种方法逻辑直白,先分别把两人的好友UID存进临时变量,再用uid_in函数取两个集合的交集:
query getCommonFriends { # 存储Catarina的所有好友UID var(func: eq(name, "Catarina")) { CatarinaFriends as friend { uid } } # 存储Michael的所有好友UID var(func: eq(name, "Michael")) { MichaelFriends as friend { uid } } # 查询同时出现在两个好友集合里的节点 common_friends(func: uid_in(CatarinaFriends, MichaelFriends)) { name } }
这里的var关键字用来定义临时变量,uid_in会精准返回同时存在于两个UID集合中的节点,也就是两人的共同好友。
方法二:嵌套过滤+@cascade(更紧凑的写法)
如果你想写得更简洁,可以用嵌套查询结合@cascade指令,它会自动过滤掉不满足嵌套条件的节点:
query getCommonFriends { common_friends(func: eq(name, "Catarina")) @cascade { # 只保留同时是Michael好友的节点 friend @filter(uid_in(func: eq(name, "Michael") { friend { uid } })) { name } } }
@cascade的作用是:只有当Catarina的某个好友,同时也是Michael的好友时,这个节点才会被保留下来,最终结果就是两人的共同好友列表。
小提醒
如果你的好友关系是双向的(比如A加了B为好友,B也加了A),那上面两种方法都能正常工作;如果是单向关系,要确保friend边的方向和你数据中的存储逻辑一致哦。
内容的提问来源于stack exchange,提问作者MacakM
相关产品推荐
相关产品推荐

