Return 某些顶点以及它们是否与特定顶点共享边
Return certain vertices and whether they share an edge with a particular vertex
我正在尝试在我的应用中模拟某些用户之间的关注者关系:
用户----关注----用户
(想想推特)
给定一组 userId,我需要 return 所有这些用户顶点和一个布尔值,如果特定用户 (currentUser
) 对这些用户有 follows
优势。所以我需要知道 currentUser
是否关注了这些用户:
user1: true
user2: true
user3: false
user4: true
我不知道如何获取关注状态。如果我 return 每个用户顶点像这样:
currentUser = g.V(1);
g.V().hasLabel("appUser").or(__.has("userId","123869681319429"),
__.has("userId","103659593341656")).valueMap();
什么是一个有效的命令来确定每个人是否都有来自 currentUser
的传入 follows
边缘?
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())
这是一种方法。假设此示例图:
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]
您上面的代码片段表明您将拥有 "current user" 个顶点以及您想要与当前用户进行比较的用户的顶点,以查看是否存在任何后续关系。鉴于该假设,您可以这样处理:
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
的值表示跟随关系,0值表示相反的没有跟随关系。因此,在上面的示例中,用户 1 关注了 2 但没有关注 3。
我正在尝试在我的应用中模拟某些用户之间的关注者关系:
用户----关注----用户
(想想推特)
给定一组 userId,我需要 return 所有这些用户顶点和一个布尔值,如果特定用户 (currentUser
) 对这些用户有 follows
优势。所以我需要知道 currentUser
是否关注了这些用户:
user1: true
user2: true
user3: false
user4: true
我不知道如何获取关注状态。如果我 return 每个用户顶点像这样:
currentUser = g.V(1);
g.V().hasLabel("appUser").or(__.has("userId","123869681319429"),
__.has("userId","103659593341656")).valueMap();
什么是一个有效的命令来确定每个人是否都有来自 currentUser
的传入 follows
边缘?
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())
这是一种方法。假设此示例图:
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]
您上面的代码片段表明您将拥有 "current user" 个顶点以及您想要与当前用户进行比较的用户的顶点,以查看是否存在任何后续关系。鉴于该假设,您可以这样处理:
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
的值表示跟随关系,0值表示相反的没有跟随关系。因此,在上面的示例中,用户 1 关注了 2 但没有关注 3。