返回某些顶点以及它们是否与特定顶点共享边

时间:2016-03-25 13:36:32

标签: titan gremlin

我正在尝试为我的应用中的某些用户建立关注关系:

用户---- ----如下用户

(想想推特)

给定一组userIds,如果特定用户(currentUser)对这些用户有follows边缘,我需要返回所有这些用户顶点和布尔值。所以我需要知道currentUser是否跟随这些用户:

  

user1:true

     

user2:true

     

user3:false

     

user4:true

我坚持如何获取该关注状态。如果我像这样返回每个用户顶点:

currentUser = g.V(1); g.V().hasLabel("appUser").or(__.has("userId","123869681319429"), __.has("userId","103659593341656")).valueMap();

什么是有效的命令来确定每个人是否有来自follows的传入currentUser边缘?

在DynamoDB上运行的TitanDB 1.0.0。

编辑 - 添加我的完整工作遍历:

g.V().hasLabel('appUser').or(__.has('cId', '1232'),__.has('cId', '1116')).group().by().by(__.in('follows').hasId(hasLabel('appUser').has('pId', 'd13dfa6').id()).count())

编辑2 - 我最后重写了这次遍历,以便使用as()select()更好地捕获我需要的数据。离开这里参考:

g.V().hasLabel('appUser').or(__.has('cId', '1232'),__.has('cId', '1116')).as('user','followCount').select('user','followCount').by(__.valueMap()).by(__.in('follows').hasId(hasLabel('appUser').has('pId', 'd13dfa6').id()).count())

1 个答案:

答案 0 :(得分:3)

这是一种方法。假设此示例图表:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> vUser1 = graph.addVertex(id,1)
==>v[1]
gremlin> vUser2 = graph.addVertex(id,2)
==>v[2]
gremlin> vUser3 = graph.addVertex(id,3)
==>v[3]
gremlin> vUser1.addEdge('follows',vUser2)
==>e[0][1-follows->2]
gremlin> vUser3.addEdge('follows',vUser3)
==>e[1][3-follows->3]

上面的代码片段演示了您将拥有“当前用户”顶点以及要与当前用户进行比较的用户的顶点,以查看是否存在任何后续关系。鉴于这种假设,你可以这样做:

gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:3 edges:2], standard]
gremlin> g.V(vUser2,vUser3).group().by().by(__.in("follows").hasId(vUser1.id()).count())
==>[v[2]:1, v[3]:0]

在这种情况下,您迭代要比较的用户顶点列表,然后对它们进行分组。遍历将输出Map,其中大于0的值表示跟随关系,值零表示没有跟随关系的相反。因此,在上面的示例中,用户1遵循2但不遵循3.