Запрос переменных в фильтре Dgraph - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать переменные (которые являются скалярами) в вызове @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 Ответ

2 голосов
/ 26 апреля 2019

Вот что говорят в 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.

...