GraphQL 变量

解析规则(使用默认值):

  • query title($name: string = "Bauman") { ... }
  • query title($age: int = "95") { ... }
  • query title($uids: string = "0x1") { ... }
  • query title($uids: string = "[0x1, 0x2, 0x3]") { ... }

可以在查询中定义和使用变量,这有助于查询重用,并通过传递单独的变量映射,避免运行时在客户端中构建代价高昂的字符串。变量以$符号开头。对于带有GraphQL变量的HTTP请求,我们必须使用Content-Type: application/json头,并通过包含查询和变量的json对象传递数据:

curl -H "Content-Type: application/json" localhost:8080/query -XPOST -d $'{
  "query": "query test($a: string) { test(func: eq(name, $a)) { \n uid \n name \n } }",
  "variables": { "$a": "Alice" }
}' | python -m json.tool | less
query test($a: int, $b: int, $name: string) {
  me(func: allofterms(name@en, $name)) {
    name@en
    director.film (first: $a, offset: $b) {
      name @en
      genre(first: $a) {
        name@en
      }
    }
  }
}
{
  "data": {
    "me": [
      {
        "name@en": "Steven Spielberg",
        "director.film": [
          {
            "name@en": "Close Encounters of the Third Kind",
            "genre": [
              {
                "name@en": "Science Fiction"
              },
              {
                "name@en": "Adventure Film"
              },
              {
                "name@en": "Drama"
              }
            ]
          }
          ...
        ]
      },
      {
        "name@en": "Steven Spielberg And The Return To Film School"
      },
      {
        "name@en": "Directors: Steven Spielberg"
      },
      {
        "name@en": "Steven Spielberg"
      }
      ...
    ]
  }
}
  • 变量可以有默认值。在下面的例子中,$a的默认值为2。因为变量映射中没有提供$a的值,所以$a采用默认值。
  • 类型以!不能有默认值,但必须有一个值作为变量映射的一部分。
  • 变量的值必须对给定的类型具有可解析性,如果不能,则抛出错误。
  • 目前支持的变量类型有:int、float、bool和string。
  • 任何正在使用的变量都必须在开头的命名查询子句中声明。
query test($a: int = 2, $b: int!, $name: string) {
  me(func: allofterms(name@en, $name)) {
    director.film (first: $a, offset: $b) {
      genre(first: $a) {
        name@en
      }
    }
  }
}
{
  "data": {
    "me": [
      {
        "director.film": [
          {
            "genre": [
              {
                "name@en": "Science Fiction"
              },
              {
                "name@en": "Adventure Film"
              }
            ]
          },
          {
            "genre": [
              {
                "name@en": "Horror"
              },
              {
                "name@en": "Science Fiction"
              }
            ]
          }
        ]
      }
    ]
  }
}

你也可以使用数组与GraphQL变量:

query test($a: int = 2, $b: int!, $aName: string, $bName: string) {
  me(func: eq(name@en, [$aName, $bName])) {
    director.film (first: $a, offset: $b) {
      genre(first: $a) {
        name@en
      }
    }
  }
}
{
  "data": {
    "me": [
      {
        "director.film": [
          {
            "genre": [
              {
                "name@en": "Indie film"
              },
              {
                "name@en": "Thriller"
              }
            ]
          },
          {
            "genre": [
              {
                "name@en": "Farce"
              },
              {
                "name@en": "Comedy"
              }
            ]
          }
        ]
      },
      {
        "director.film": [
          {
            "genre": [
              {
                "name@en": "Science Fiction"
              },
              {
                "name@en": "Adventure Film"
              }
            ]
          },
          {
            "genre": [
              {
                "name@en": "Horror"
              },
              {
                "name@en": "Science Fiction"
              }
            ]
          }
        ]
      }
    ]
  }
}

我们还支持facet变量替换:

query test($name: string = "Alice", $IsClose: string = "true") {
  data(func: eq(name, $name)) {
    friend @facets(eq(close, $IsClose)) {
      name
    }
      colleague : friend @facets(eq(close, false)) {
      name
    }
  }
}
{
  "data": {
    "data": [
      {
        "friend": [
          {
            "name": "Bob"
          },
          {
            "name": "Dave"
          }
        ],
        "colleague": [
          {
            "name": "Charlie"
          }
        ]
      }
    ]
  }
}