【问题标题】:Dgraph: How do you query for strings that start with a specific sequence of letters?Dgraph:如何查询以特定字母序列开头的字符串?
【发布时间】:2020-01-01 05:04:27
【问题描述】:

例如,假设您的数据库包含一堆 People{ name } 对象,并且您想查找名称以字母“H”或“Mi”开头的每个人。

【问题讨论】:

    标签: dgraph


    【解决方案1】:

    你应该使用正则表达式https://docs.dgraph.io/query-language/#regular-expressions 但是,正则表达式至少接受 3 个字符。

    您可以做的其他方式是使用“has”函数并按谓词排序。 https://docs.dgraph.io/query-language/#has

    {
      me(func: has(name), first: 50, orderasc: name) {
        name
      }
    }
    

    但使用“拥有”功能,您无法完全控制。它将按照字母顺序。

    获得这种级别的控制的一种方法是创建一个伪索引结构。每次添加用户时,都会将他与将扮演索引角色的树相关联。并且通过这棵树你可以计算和遍历边缘。

    例如:

    假设您知道树的 UID(或者您使用 Upser Block)。

    _:NewUser <name> "Lucas" .
    _:NewUser <pred1> "some1" .
    _:NewUser <pred2> "some2" .
    
    # Now we gonna relate Lucas to our tree and <0x33f> is the uid for the letter L of "Lucas"
    
     <0x33f> <firstCharacter> _:NewUser . #This is a reverse record (you don't need to use @reverse tho)
    

    使用 Upsert 块的相同示例:

    upsert {
      query {
        v as var(func: type(myTree)) @filter(eq(letter, "L"))
      }
    
      mutation {
        set {
          _:NewUser <name> "Lucas" .
          _:NewUser <pred1> "some1" .
          _:NewUser <pred2> "some2" .
          uid(v) <firstCharacter> _:NewUser .
        }
      }
    }
    

    树中的基本搜索如下:

    {
      q(func: type(myTree)) @filter(eq(letter, "L")) {
        letter
        firstCharacter { name pred1 pred2 }
      }
    }
    

    或者

    {
      q(func: type(myTree)) @filter(eq(letter, "L")) {
        letter
        count(firstCharacter)
      }
    }
    

    干杯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2019-10-29
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多