我试图在@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
}
我在做什么错了?
答案 0 :(得分:2)
Dgraph文档说的是关于值变量(加了强调):https://docs.dgraph.io/query-language/#value-variables
值变量存储标量值。值变量是来自UID的映射 封闭块的相应值。
因此,仅在一个变量中使用值变量中的值才有意义 与相同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
}
}
}
}
我还向start_ua谓词添加了(first: 1)
,以便最多提取1个节点并存储sua
变量。如果您的数据已经按照这种方式进行了构造,则不需要。
val(sua)
获取变量sua
的值。