You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Dgraph中如何实现嵌套查询过滤?筛选指定主演的电影

Dgraph查询问题:如何基于嵌套关联过滤主实体结果

存储的电影数据

[
    {
        name: "movie1",
        release: 2016,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    },
    {
        name: "movie2",
        release: 2017,
        mainActor: {
            uid: 0x15,
            name: "actor2",
            birth: 1991
        }
    },
    {
        name: "movie3",
        release: 2018,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    }
]

当前使用的查询语句

{
    movies(func: type(Movie)) {
        name
        release
        mainActor @filter(uid(0x12)) {
            name
            birth
        }
    }
}

预期输出

[
    {
        name: "movie1",
        release: 2016,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    },
    {
        name: "movie3",
        release: 2018,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    }
]

实际返回结果

[
    {
        name: "movie1",
        release: 2016,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    },
    {
        name: "movie2",
        release: 2017
    },
    {
        name: "movie3",
        release: 2018,
        mainActor: {
            uid: 0x12,
            name: "actor1",
            birth: 1990
        }
    }
]

问题原因

你当前的查询是在嵌套的mainActor字段上添加过滤条件,这只会隐藏不符合条件的关联数据,但不会剔除主实体(Movie)本身。movie2因为属于Movie类型,依然会被返回,只是它的mainActor不符合过滤规则,所以该字段不显示。

正确解决方案

要筛选出仅关联actor1的电影,需要在根查询的func或@filter中直接基于mainActor的关联条件过滤主实体,而非仅在嵌套字段中过滤。以下是几种可行写法:

方法1:直接通过uid过滤主实体

{
  movies(func: type(Movie)) @filter(eq(mainActor, 0x12)) {
    name
    release
    mainActor {
      name
      birth
    }
  }
}

方法2:通过演员名称反向查询(无需硬编码uid)

如果不想固定uid,可先定位到actor1的节点,再通过反向边查询关联的电影:

{
  actor(func: eq(name, "actor1")) {
    name
    birth
    ~mainActor {
      name
      release
    }
  }
}

这里~mainActor是反向边语法,代表查询所有以该演员为mainActor的电影节点。

方法3:使用变量关联查询

先定义变量存储actor1的uid,再用该变量过滤电影:

{
  var(func: eq(name, "actor1")) {
    a as uid
  }
  movies(func: type(Movie)) @filter(eq(mainActor, val(a))) {
    name
    release
    mainActor {
      name
      birth
    }
  }
}

以上写法都会直接返回符合条件的movie1和movie3,不会包含movie2,与你的预期输出一致。


内容的提问来源于stack exchange,提问作者JrDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:55:24