Dgraph QL 入门

0x01 HelloWorld(简单查询)

{
    find_someone(func: eq(name, "SomeOne's name")) {
        uid
        name
        age
        sex
    }
}
复制代码

上面的查询语句表示, 新建一个名为 find_someone 的query, 查询条件为集合内name等于 SomeOne's name的实体, 并返回 uid, name, age, sex 字段。 其中 uid 是 dgraph 内部的用来标识entity的惟一identify, 是一个16进制的数. 也能够经过uid 来查询某个entity:express

{
    find_someone(func: uid(0x6)) {
        name
        age
        sex
        uid
        someFieldNotFound # 若是字段不存在,则不显示,不会报错
    }
}
复制代码

0x02 关系查询

能够查询某entity和另外的entity的关系(edge)json

{
    find_someone(func: eq(name, "Michael")) {
        name
        age
        uid
        owner_pet {  # 查询Michael拥有的宠物
            name
        }
        friend { # 查询Michael的朋友
            name
            age
            uid
            friend {
                name # 查询Michael朋友的朋友
            }
        }
    }
}
复制代码

Response:ide

{
  "data": {
    "find_someone": [
      {
        "name": "Michael",
        "age": 39,
        "uid": "0x3",
        "friend": [
          {
            "age": 35,
            "uid": "0x4",
            "friend": [
              {
                "name": "Michael"
              }
            ]
          },
          {
            "age": 24,
            "uid": "0x5",
            "friend": [
              {
                "name": "Catalina"
              }
            ]
          },
          {
            "name": "Catalina",
            "age": 19,
            "uid": "0x6"
          },
          {
            "age": 35,
            "uid": "0x7"
          },
          {
            "name": "Sarah",
            "age": 55,
            "uid": "0xa"
          }
        ]
      }
    ]
  }
复制代码

0x03 数据类型和节点

Dgraph中可用的数据类型有:函数

  • int signed 64 bit integer
  • float double precision floating point number
  • string string
  • bool boolean
  • id ID’s stored as strings
  • dateTime RFC3339 time format with optional timezone eg: 2006-01-02T15:04:05.999999999+10:00 or 2006-01-02T15:04:05.999999999
  • geo geometries stored using go-geom
  • uid uid

0x04 多语言支持

Dgraph支持UTF-8编码的字符串文本查询.ui

字符串值谓词能够用language tag进行注释.编码

好比:spa

"Lily"@en # 表示以英文存储
    "अमित"@hi # 表示以菲律宾语存储
    "상현"@ko  # 表示以韩文存储
    "张三"@ch  # 表示中文存储
复制代码

Query能够经过以哪一种语言搜索以及以哪一种语言返回来搜索带Tag语言的文本. 若是是以此种格式要求返回: @lang1:...:langN, 则需遵循如下规则:code

  • 至少返回一个结果
  • 若是结果存在于首选语言中,则返回最左边(在首选项列表中)的结果
  • 若是结果不存在于首选语言中,则不返回结果,除非首选项列表以.结尾,在这种状况下,将返回没有指定语言的值.

0x05 函数和过滤

节点根据应用于节点edge的函数进行过滤.orm

过滤不只能够应用在查询的顶级节点上, 事实上, 查询过滤能够应用在任何节点上.排序

下列是一些经常使用的过滤函数:

  • allOfTerms(edge_name, "term1 ... termN"): 以任何顺序匹配符合全部指定模式的字符串;不区分大小写

  • anyOfTerms(edge_name, "term1 ... termN"): 以任何顺序匹配符合任何指定模式的字符串;不区分大小写

  • 等值或不等值查询过滤, 能够用来比较的类型有: int, float, stringdate.

    1. eq(edge_name, value): 等于
    2. ge(edge_name, value): 大于等于
    3. le(edge_name, value): 小于等于
    4. gt(edge_name, value): 大于
    5. lt(edge_name, value): 小于
  • 还有其余过滤函数诸如: regular expression, full text search, geo search

eg.

{
    filter_friend(func: allofterms(name, "Michael")) {
        name
        age
        friend @filter(le(age, 27)) { # 子过滤, 过滤出年龄小于27的朋友..
          name@. # tag 为 . , 表示显示全部语言类别的name
          age
        }
    }
}
复制代码

Response:

{
  "data": {
    "filter_friend": [
      {
        "name": "Michael",
        "age": 39,
        "friend": [
          {
            "name@.": "Sang Hyun",
            "age": 24
          },
          {
            "name@.": "Catalina",
            "age": 19
          }
        ]
      }
    ]
  }
}
复制代码

0x06 逻辑运算(AND, OR and NOT)

逻辑操做符 AND, ORNOT 能够在一个filter中组合多个function.

eg.

{
  filter_test(func: anyofterms(name, "Michael")) {
    age
    name
    friend @filter(lt(age, 40) AND gt(age, 20)) { # 过滤大于20且小于40的friend.
      name@.
      age
    }
  }
}

{
  filter_test(func: anyofterms(name, "Michael")) {
    age
    name
    friend @filter(NOT ge(age, 20)) { # 过滤小于20的friend.
      name@.
      age
    }
  }
}
复制代码

注意: 逻辑操做符不能直接用于func关键字以后, 好比:

{
  filter_xxx(func: AND allofterms()) ... # 报错
}
复制代码

0x07 排序

查询结果可使用 orderascorderdesc 来升降序排序.

排序结果只会在JSON Response中才会体现.

eg.

{
  filter_test(func: allofterms(name, "Michael")) {
    age
    name
    friend (orderdesc: age) { # 以age倒序排列
      name@.
      age
    }
  }
}
复制代码

0x08 分页(offset, first, after)

一般来讲,一个查询返回上万的结果的状况并不罕见.

有些场景下, 咱们可能不须要这么多的数据,或者只是须要 top-K 的数据, 对结果进行分页显示,或者limit一些结果.

GraphQL+- 语法中, 关键字: offset, first, after 能够和排序功能组合使用.

  • first: N 返回前N个结果
  • offset: N 跳过前N个结果
  • after: uid 返回该uid以后的数据

这里的N必须是无符号整型

默认的, 查询结果经过uid进行排序.

eq.

{
  filter_test(func: allofterms(name, "Michael")) {
    age
    name
    friend (orderdesc: name@., first: 2, offset: 1) { 
      name@.
      age
    }
  }
}
复制代码

0x09 计数(Count)

使用 count 函数能够统计结果集中的edges个数.

eg.

{
  filter_test(func: anyofterms(name, "Michael")) {
    age
    name
    count(friend)
  }
}
复制代码

Response:

"data": {
    "filter_test": [
      {
        "age": 39,
        "name": "Michael",
        "count(friend)": 5
      }
    ]
  }
}
复制代码
相关文章
相关标签/搜索