在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
相关产品推荐
相关产品推荐

