过滤

这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 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

若要根据电影的类型过滤针对 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: { 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" 类型外的所有已删除电影会触发此订阅的事件。

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
        }
    }
}