0

我试图在@filter(ge(...))调用中使用变量(这是一个标量),但我遇到了一个错误

给定以下查询

{
  ua(func: uid(0xfb7f7)) {
    uid
    start_ua {
      sua as index
    }
    recorded_in {
      actions @filter(ge(index, sua)){
        index
      }
    }
  }
}

我收到以下错误

{
  "errors": [
    {
      "code": "ErrorInvalidRequest",
      "message": "Some variables are defined but not used\nDefined:[sua]\nUsed:[]\n"
    }
  ],
  "data": null
}

现在,如果我从查询中删除sua as ...@filter(...),一切正常。我的 Dgraph 版本是 v1.0.13。

我尝试替换@filter(ge(index, sua))为,@filter(ge(index, val(sua)))但仍然遇到错误:

{
  "errors": [
    {
      "code": "ErrorInvalidRequest",
      "message": ": No value found for value variable \"sua\""
    }
  ],
  "data": null
}

我究竟做错了什么?

4

1 回答 1

3

以下是 Dgraph 文档关于值变量的说明(重点添加):https ://docs.dgraph.io/query-language/#value-variables

值变量存储标量值。值变量是从封闭块的 UID 到相应值的映射。

因此,只有在匹配相同 UID 的上下文中使用值变量的值才有意义 -如果在匹配不同 UID 的块中使用值变量,则值变量是未定义的

start_ua和是不同的recorded_in子图,这意味着在同一查询块中的一个中定义的变量在另一个中未定义。

您可以做的是使用多个查询块。变量可以跨块访问:

{
  block1(func: uid(0xfb7f7)) {
    uid
    start_ua (first: 1) {
      sua as index
    }

  }
  
  block2(func: uid(0xfb7f7)) {
    recorded_in {
      actions @filter(ge(index, val(sua))) {
        index
      }
    }
  }
}

我还添加(first: 1)了 start_ua 谓词,以便最多获取 1 个节点并存储sua变量。如果您的数据已经以这种方式构建,则不需要这样做。

val(sua)获取变量的值sua

于 2019-04-26T19:16:51.677 回答