Neo4j查询问题:获取顶刊高发文作者时无法访问articlesCount变量
问题:找到文章最多期刊中发文量最高的作者
我的Neo4j数据库存在以下关系:
(:journal)<-[:BELONGS_TO_JOURNAL]-(:article) (:person)-[:WROTE]->(:article)
需求是:找到文章数量最多的期刊里,发文量最高的作者。
我已经能查询到文章数量最多的期刊:
match (j:journal)-[:BELONGS_TO_JOURNAL]-() return j.name, count(*) as articlesCount order by articlesCount desc limit 1
但尝试以下查询时遇到问题:因为使用了count(*)进行聚合,无法在RETURN语句中使用articlesCount变量:
match (j:journal)-[:BELONGS_TO_JOURNAL]-() with j as j, count(*) as articlesCount match (j)<-[:BELONGS_TO_JOURNAL]-(a:article)<-[:WROTE]-(p:person) return p, count(*) as authorsCount order by articlesCount, authorsCount limit 1
解决方法
问题核心是:第二个MATCH后的count(*)会触发聚合操作,而articlesCount未被纳入聚合分组键,导致无法在RETURN中引用。可以通过以下两种方式调整查询逻辑:
方式1:分步锁定目标期刊后统计作者发文量
先筛选出文章最多的期刊,再基于该期刊统计作者的发文量:
// 第一步:筛选出文章数量最多的期刊,仅保留该期刊节点及文章数 MATCH (j:journal)-[:BELONGS_TO_JOURNAL]-() WITH j, count(*) AS articlesCount ORDER BY articlesCount DESC LIMIT 1 // 第二步:统计该期刊下作者的发文量,取排名第一的作者 MATCH (j)<-[:BELONGS_TO_JOURNAL]-(a:article)<-[:WROTE]-(p:person) RETURN p, count(a) AS authorArticleCount ORDER BY authorArticleCount DESC LIMIT 1
如果需要同时展示期刊信息,可修改RETURN语句:
MATCH (j:journal)-[:BELONGS_TO_JOURNAL]-() WITH j, count(*) AS articlesCount ORDER BY articlesCount DESC LIMIT 1 MATCH (j)<-[:BELONGS_TO_JOURNAL]-(a:article)<-[:WROTE]-(p:person) RETURN j.name AS journalName, articlesCount, p, count(a) AS authorArticleCount ORDER BY authorArticleCount DESC LIMIT 1
方式2:使用子查询直接定位目标期刊(Neo4j 4.0+适用)
如果你的Neo4j版本为4.0及以上,可通过子查询简化逻辑,直接筛选出目标期刊后统计作者:
MATCH (p:person)-[:WROTE]->(a:article)-[:BELONGS_TO_JOURNAL]->(j:journal) WHERE j = ( // 子查询获取文章数量最多的期刊 MATCH (j:journal)-[:BELONGS_TO_JOURNAL]-() RETURN j ORDER BY count(*) DESC LIMIT 1 ) RETURN p, count(a) AS authorArticleCount ORDER BY authorArticleCount DESC LIMIT 1
内容的提问来源于stack exchange,提问作者Pietro Lodi Rizzini
相关产品推荐
相关产品推荐

