过滤
|
这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 5 LTS 版本。 |
本页介绍如何在 Neo4j GraphQL 库中对订阅应用过滤器。不过请注意,
-
过滤只能在订阅操作的根部使用。
-
订阅类型不支持聚合,且目前没有可用的方法。
可以创建订阅以针对节点的更改(create/update/delete)或关系的更改(create/`delete)。
虽然格式会因订阅是针对节点还是关系而略有不同,但提供 where 参数可以对返回给订阅的事件进行过滤。
订阅节点事件
where 参数允许对目标节点的顶层属性进行过滤。仅返回与这些属性及类型匹配的事件给订阅。
下面示例展示了类型定义
type Movie @node {
title: String
genre: String
averageRating: Float
releasedIn: Int
}
extend schema @subscription
下面展示了创建订阅时如何应用过滤
CREATE
若要根据电影的类型过滤针对 create 操作的订阅,可按如下方式实现
subscription {
movieCreated(where: { genre: { eq: "Drama" } }) {
createdMovie {
title
}
}
}
这样,只有类型为 "Drama" 的新创建电影会触发此订阅的事件。
|
|
UPDATE
以下示例演示如何过滤针对平均评分大于 8 的电影的 update 操作订阅
subscription {
movieUpdate(where: { averageRating: { gt: 8 } }) {
updatedMovie {
title
}
}
}
这样,您只会在这些电影被修改且平均评分大于 8 时收到触发的事件。
|
|
事件可能的样例如下
mutation {
makeTheMatrix: createMovies(input: {title: "The Matrix", averageRating: 8.7}) {
title
averageRating
},
makeResurrections: createMovies(input: {title: "The Matrix Resurrections", averageRating: 5.7}) {
title
averageRating
},
}
mutation {
updateTheMatrix: updateMovie(
where: { title: { eq: "The Matrix" } }
update: { averageRating: { set: 7.9 }}
) {
title
},
updateResurrections: updateMovie(
where: { title: { eq: "The Matrix Resurrections" }}
update: { averageRating: { set: 8.9 }}
) {
title
}
}
因此,基于前述订阅,这些 GraphQL 操作应仅针对电影 "The Matrix" 触发。
DELETE
下面展示如何使用 NOT 过滤器,根据电影的类型过滤针对 delete 操作的订阅
subscription {
movieDeleted(where: { NOT: { genre: { eq: "Comedy" } } }) {
deletedMovie {
title
}
}
}
这样,除 "Comedy" 类型外的所有已删除电影会触发此订阅的事件。
|
|
组合运算符
所有前述运算符都可以使用 AND、OR 和 NOT 运算符进行组合。它们接受一个与 where 参数相同格式的项目数组,这意味着它们也可以嵌套以形成复杂的组合。
例如,假设有用户喜欢喜剧电影,但不喜欢 2000 年初的浪漫喜剧,并且将《黑客帝国》三部曲作为最爱。该用户可以如下订阅符合这些兴趣的更新
subscription {
movieUpdated(where: {
OR: [
{ title: { contains: "Matrix" } },
{ genre: { eq: "comedy"} },
{ AND: [
{ NOT: { genre: { eq: "romantic comedy" }} },
{ releasedIn: { gt: 2000 } },
{ releasedIn: { lte: 2005 } }
] },
]
}) {
updatedMovie {
title
}
}
}