过滤

这是 GraphQL 库版本 7 的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL 库版本 5 LTS

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

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

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

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

虽然格式因订阅目标是节点还是关系而略有不同,但提供 where 参数允许对返回到订阅的事件进行过滤。

运算符

创建订阅时,where 参数中针对不同类型有多种运算符可用。

相等运算符

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

数值运算符

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

  • lt

  • lte

  • gte

  • gt

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

字符串比较

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

  • startsWith

  • endsWith

  • contains

数组比较

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

  • in

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

  • includes

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

AND/OR 运算符

可以使用 AND/OR 运算符进行复杂的运算符组合。它们接受一个与 where 参数格式相同的项目数组作为参数。

请查看组合运算符了解示例。

订阅节点事件

where 参数允许对目标节点的顶级属性指定过滤器。只有与这些属性和类型匹配的事件才会返回给订阅。

例如,考虑以下类型定义

type Movie @node {
    title: String
    genre: String
    averageRating: Float
    releasedIn: Int
}
extend schema @subscription

现在,以下是如何在创建订阅时应用过滤

创建 (CREATE)

要按电影的类型过滤对 创建 操作的订阅,可以这样做

subscription {
    movieCreated(where: { genre: { eq: "Drama" } }) {
        createdMovie {
            title
        }
    }
}

这样,只有类型为 "Drama" 的新创建电影才会触发此订阅的事件。

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

更新 (UPDATE)

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

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: { set: 7.9 }}
    ) {
        title
    },
    updateResurrections: updateMovie(
        where: { title: { eq: "The Matrix Resurrections" }}
        update: { averageRating: { set: 8.9 }}
    ) {
        title
    }
}

因此,根据前面描述的订阅,这些 GraphQL 操作应仅针对电影 "The Matrix" 触发。

删除 (DELETE)

以下是如何使用 NOT 过滤器按电影的类型过滤对 删除 操作的订阅

subscription {
    movieDeleted(where: { NOT: { genre: { eq: "Comedy" } } }) {
        deletedMovie {
            title
        }
    }
}

这样,只有被删除的电影(除了 "喜剧" 类型)才会触发此订阅的事件。

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

组合运算符

所有前面提到的运算符都可以使用 ANDORNOT 运算符进行组合。它们接受一个与 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
        }
    }
}
© . All rights reserved.