按范围计算密码查询的结果
Counting the results of a cypher query by range
我想按范围统计我的密码查询结果。
举个例子:假设我有一个包含出版年份的图书列表,我希望能够计算出与我的密码查询相匹配的图书在 1970 年和 1979 年、1980 年和 1989 年之间出版的数量, ... ,2010 和 2019
如果您在 Book
个节点上有 published_year
属性,则查询将如下所示:
MATCH (b:Book)
WHERE b.published_year > 1969 AND b.published_year < 1980
WITH count(b) AS num
RETURN num;
几点注意事项
- 确保
published_year
属性 是一个整数 - 在创建 属性. 时使用 Cypher toInt()
函数
- 在 Neo4j 2.3+ 中,索引可以支持这些类型的范围查询。在
published_year
属性 上创建索引以提高查找效率:CREATE INDEX ON :Book(published_year)
有关索引的更多信息 here
如果您想在一个查询中完成所有操作,我会这样做:
MATCH (b:Book)
RETURN SUM(CASE WHEN 1970 <= b.published < 1980 THEN 1 ELSE 0 END) AS `70s`,
SUM(CASE WHEN 1980 <= b.published < 1990 THEN 1 ELSE 0 END) AS `80s`,
SUM(CASE WHEN 1990 <= b.published < 2000 THEN 1 ELSE 0 END) AS `90s`,
SUM(CASE WHEN 2000 <= b.published < 2010 THEN 1 ELSE 0 END) AS `00s`,
SUM(CASE WHEN 2010 <= b.published < 2020 THEN 1 ELSE 0 END) AS `10s`
尽管我认为这不会利用 b.published
上的任何索引。这种类型的范围查询也只适用于 Neo4j 2.3。
我想按范围统计我的密码查询结果。
举个例子:假设我有一个包含出版年份的图书列表,我希望能够计算出与我的密码查询相匹配的图书在 1970 年和 1979 年、1980 年和 1989 年之间出版的数量, ... ,2010 和 2019
如果您在 Book
个节点上有 published_year
属性,则查询将如下所示:
MATCH (b:Book)
WHERE b.published_year > 1969 AND b.published_year < 1980
WITH count(b) AS num
RETURN num;
几点注意事项
- 确保
published_year
属性 是一个整数 - 在创建 属性. 时使用 Cypher - 在 Neo4j 2.3+ 中,索引可以支持这些类型的范围查询。在
published_year
属性 上创建索引以提高查找效率:CREATE INDEX ON :Book(published_year)
有关索引的更多信息 here
toInt()
函数
如果您想在一个查询中完成所有操作,我会这样做:
MATCH (b:Book)
RETURN SUM(CASE WHEN 1970 <= b.published < 1980 THEN 1 ELSE 0 END) AS `70s`,
SUM(CASE WHEN 1980 <= b.published < 1990 THEN 1 ELSE 0 END) AS `80s`,
SUM(CASE WHEN 1990 <= b.published < 2000 THEN 1 ELSE 0 END) AS `90s`,
SUM(CASE WHEN 2000 <= b.published < 2010 THEN 1 ELSE 0 END) AS `00s`,
SUM(CASE WHEN 2010 <= b.published < 2020 THEN 1 ELSE 0 END) AS `10s`
尽管我认为这不会利用 b.published
上的任何索引。这种类型的范围查询也只适用于 Neo4j 2.3。