Dgraph过滤器中的查询变量

时间:2019-04-18 08:02:27

标签: dgraph

我试图在@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
}

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

Dgraph文档说的是关于值变量(加了强调):https://docs.dgraph.io/query-language/#value-variables

  

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

     

因此,仅在一个变量中使用值变量中的值才有意义   与相同UID匹配的上下文-如果在与其他UID匹配的块中使用   UID的值变量未定义

start_uarecorded_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
      }
    }
  }
}

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

val(sua)获取变量sua的值。