0

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

4

1 回答 1

0

您应该使用正则表达式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)
  }
}

干杯。

于 2019-12-31T21:04:27.883 回答