【问题标题】:How to know if the searched user is a friend already using Gremlin?如何知道搜索到的用户是否是已经在使用 Gremlin 的朋友?
【发布时间】:2020-07-06 05:10:51
【问题描述】:

我们正在使用 Gremlin 查询 JanusGraph,我还是个初学者。我们现在有这个查询来搜索使用姓名、电话号码或电子邮件地址的用户。

    g.V()
    .or(
        filter({ it.get().value("name").contains(queryStr)}),
        filter({ it.get().value("phone").contains(queryStr)}),
        filter({ it.get().value("email").contains(queryStr)}) 
    )
    .not(has('users','email',email))
    .order().by('name').valueMap()

结果如下:

[
  {
    phone: [ '+63123456789' ],
    displayName: [ 'User Name' ],
    name: [ 'username' ],
    email: [ 'user@example.com' ],
    picture: [ '' ]
  }
]

查询的问题是我们无法确定您是否已经是用户的朋友。我想添加一个动态属性,如 isFriend、isRequestPending,如果可能的话,它看起来像这样(如果不是,也许类似的东西会做):

[
  {
    phone: [ '+63123456789' ],
    displayName: [ 'User Name' ],
    name: [ 'username' ],
    email: [ 'user@example.com' ],
    picture: [ '' ],
    isFriend: [ 'true' ],
    isRequestPending: [ 'false' ]
  }
]

提供更多信息: 边缘的标签称为“朋友”。将用户添加为朋友时,我们将朋友边缘分配给用户,例如:

A --friend--> B

如果用户 B 接受了请求,那么我们将边缘分配给用户 A

B --friend--> A

感谢那些可以提供帮助的人。

【问题讨论】:

    标签: gremlin janusgraph gremlin-server


    【解决方案1】:

    valueMap() 步骤非常方便,但有点像 SQL 中的SELECT * FROM table,通常不建议这样做。您可以为其提供特定的键来返回,这会更好,但这仍然无助于您在引用它们时添加额外的“动态键”。为此,您通常更喜欢project()

    g.V().or(filter({ it.get().value("name").contains(queryStr)}),
             filter({ it.get().value("phone").contains(queryStr)}),
             filter({ it.get().value("email").contains(queryStr)})).
      not(has('users','email',email)).
      order().by('name').
      project('phone','displayName','name','email','picture','isFriend','isRequestPending').
        by('phone').
        by('name').
        by('email').
        by('picture').
        by(coalesce(out('friend').has('name','B').constant(true), constant(false)).
        by(coalesce(__.in('friend').has('name','B').constant(false), constant(true))
    

    附带说明,您应该摆脱那些 lambda 表达式 - JanusGraph 没有机会优化那些使用索引。您应该创建 appropriate indices 并更喜欢 textContains (docs) 类似:

    g.V().or(has("name", textContains(queryStr)),
             has("phone", textContains(queryStr)),
             has("email", textContains(queryStr))).
      not(has('users','email',email)).
      order().by('name').
      project('phone','displayName','name','email','picture','isFriend','isRequestPending').
        by('phone').
        by('name').
        by('email').
        by('picture').
        by(coalesce(out('friend').has('name','B').constant(true), constant(false)).
        by(coalesce(__.in('friend').has('name','B').constant(false), constant(true))
    

    【讨论】:

      【解决方案2】:

      非常感谢@stephenmallete,我能够改进我的查询。

              g.V()
              .or(
                  has("name", textContainsRegex(queryStr)),
                  has("phone", textContainsRegex(queryStr)),
                  has("email", textContainsRegex(queryStr))
              )
              .not(has('users','email',email))
              .order().by('name')
              .project('phone','displayName','name','email','picture','relationStatus')
              .by('phone')
              .by('displayName')
              .by('name')
              .by('email')
              .by('picture')
              .by(
                  union(
                      coalesce(__.out('friend').has('email', email).constant(1), constant(0)),
                      coalesce(__.in('friend').has('email', email).constant(1), constant(0))
                  )
                  .sum()
              )
      

      此查询结果为:

      [
        {
          phone: '+63123456789',
          displayName: 'Firstname Lastname',
          name: 'firstname lastname',
          email: 'user@example.com',
          picture: 'user.jpg',
          relationStatus: 2 // 0 = not yet friend, 1 = pending, 2 = friend already
        }
      ]
      

      因此,与其拥有两个独立的属性,如 isFriend 和 isRequestPending,我意识到我可以通过将其设置为一个属性“relationStatus”来保持简单,其中 0 为尚未成为朋友,1 为待处理,2 为朋友。这样我就可以创建一个枚举并匹配该值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多