过滤
这是 GraphQL 库版本 6 的文档。有关长期支持 (LTS) 版本 5,请参阅 GraphQL 库版本 5 LTS. |
此页面介绍如何在 Neo4j GraphQL 库中将过滤器应用于订阅。但是,请注意
-
过滤只能在订阅操作的根部应用。
-
订阅类型不支持聚合,目前没有可用的方法。
可以创建订阅以定位对节点(create
/update
/delete
)或关系(create
/delete
)的更改。
虽然格式略有不同,具体取决于订阅是定位节点还是关系,但提供 where
参数允许对返回到订阅的事件进行过滤。
运算符
在创建订阅时,where
参数中可以使用许多运算符来处理不同类型。
AND
/OR
运算符
可以使用 AND
/ OR
运算符创建复杂运算符组合。它们接受以与 where
参数相同的格式作为参数的数组,这意味着它们也可以嵌套以形成复杂的组合。
有关示例,请查看 组合运算符。
订阅节点事件
where
参数允许指定对目标节点顶层属性的过滤器。仅匹配这些属性和类型的事件将返回到订阅。
例如,考虑以下类型定义
type Movie @node {
title: String
genre: String
averageRating: Float
releasedIn: Int
}
现在,以下是如何在创建订阅时应用过滤
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: 7.9 }
) {
title
},
updateResurrections: updateMovie(
where: { title_EQ: "The Matrix Resurrections" }
update: { averageRating: 8.9 }
) {
title
}
}
因此,鉴于之前描述的订阅,这些 GraphQL 操作应该仅针对 "The Matrix"
电影触发。
DELETE
以下是如何使用 NOT
过滤器按类型过滤对电影的 delete
操作的订阅
subscription {
movieDeleted(where: { NOT: { genre_EQ: "Comedy" } }) {
deletedMovie {
title
}
}
}
这样,只有所有类型的已删除电影(除了 "Comedy"
)应该触发事件到此订阅。
|
组合运算符
所有前面提到的运算符都可以使用 AND
、OR
和 NOT
运算符组合。它们接受以与 where
参数相同的格式作为参数的数组,这意味着它们也可以嵌套以形成复杂的组合。
例如,假设一位用户喜欢喜剧电影,但不喜歡 2000 年初的浪漫喜剧,并且 Matrix 三部曲是他们最喜欢的标题。他们可以订阅涵盖这组特定兴趣的任何更新,如下所示
subscription {
movieUpdated(where: {
OR: [
{ title_CONTAINS: "Matrix" },
{ genre_EQ: "comedy" },
{ AND: [
{ NOT: { genre_EQ: "romantic comedy" } },
{ releasedIn_GT: 2000 },
{ releasedIn_LTE: 2005 }
] },
]
}) {
updatedMovie {
title
}
}
}