过滤

这是 GraphQL 库版本 6 的文档。有关长期支持 (LTS) 版本 5,请参阅 GraphQL 库版本 5 LTS.

此页面介绍如何在 Neo4j GraphQL 库中将过滤器应用于订阅。但是,请注意

  • 过滤只能在订阅操作的根部应用。

  • 订阅类型不支持聚合,目前没有可用的方法。

可以创建订阅以定位对节点(create/update/delete)或关系(create/delete)的更改。

虽然格式略有不同,具体取决于订阅是定位节点还是关系,但提供 where 参数允许对返回到订阅的事件进行过滤。

运算符

在创建订阅时,where 参数中可以使用许多运算符来处理不同类型。

相等运算符

所有类型都可以测试相等或不相等。对于 Boolean 类型,这些是唯一可用的比较运算符。

数字运算符

以下比较运算符适用于数字类型(IntFloatBigInt

  • _LT

  • _LTE

  • _GTE

  • _GT

目前不支持对 时间类型空间类型 进行过滤。

字符串比较

以下区分大小写的比较运算符仅可用于 StringID 类型

  • _STARTS_WITH

  • _ENDS_WITH

  • _CONTAINS

数组比较

以下运算符适用于非数组字段,并接受数组参数

  • _IN

相反,以下运算符适用于数组字段,并接受单个参数

  • _INCLUDES

这些运算符适用于除 Boolean 之外的所有类型。

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" 的电影才会触发事件到此订阅。

where 参数仅根据创建时的属性进行过滤。

UPDATE

以下是如何过滤对平均评分大于 8 的电影的 update 操作的订阅

subscription {
    movieUpdate(where: { averageRating_GT: 8 }) {
        updatedMovie {
            title
        }
    }
}

这样,您应该仅在修改平均评分大于 8 的电影时接收由这些电影触发的事件。

where 参数仅过滤在更新之前已经存在的属性。

以下是如何显示这些事件

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")应该触发事件到此订阅。

where 参数仅过滤删除过程之前已经存在的属性。

组合运算符

所有前面提到的运算符都可以使用 ANDORNOT 运算符组合。它们接受以与 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
        }
    }
}