以下查询将返回研究人员列表以及他们撰写的相应论文列表。在每篇论文旁边,每篇论文被其他论文所引用的次数。
MATCH (p:Paper) - [c:CITED_BY] -> (p2:Paper)
MATCH (p) - [w:WRITTEN_BY] -> (a:Author)
WITH a, p, count(c) as numCitations
ORDER BY a.authorName
RETURN a.authorName, p.paperTitle, numCitations
以下查询旨在返回相同的作者列表,但是这次我想从他/她的论文总共收到的引用中得知,这是被引用次数最少的。看到这里我需要来自上一个查询的参数numCitations(我将扫描一列中的最小数字!)
MATCH (p:Paper) - [c:CITED_BY] -> (p2:Paper)
MATCH (p) - [w:WRITTEN_BY] -> (a:Author)
WITH a, count(c) as numCit
ORDER BY a.authorName
RETURN a.authorName, min(numCitations)
是这样的:
Query 1
Author Paper numCitations
Alan A 8
Alan B 6
Alan C 4
Alan D 2 (this is the minimum for Alan's papers)
Query 2
Author min(numCitations)
Alan 2 (I do not know how to get this number in Neo4j)
最后,我想计算每个作者的h索引(但我首先需要此输入)。 谢谢!!!
答案 0 :(得分:0)
看起来您已经很接近了,您只需要确保使用的变量与之前的变量(addEventListener
相同,并确保您对numCit
的计算是根据每位作者的论文数量,因此您需要在WITH子句中包含numCit
,因为聚合是针对非聚合变量进行分组的。
使用:CITED_BY关系的size()而不是将它们放置在您的模式中也将更加有效,因为这将使用更有效的度数计算(节点通过类型/方向知道关系的数量),但是仅当:Paper节点可以互相引用时,您才可以这样做(如果还有其他类型的节点可以引用论文,那么您就无法进行此优化)。这也可以确保您考虑没有任何引用的论文。
您的查询如下所示:
p
编辑
要同时返回作者的最少引用次数,每篇论文的行数和引用次数,您需要在计算最小值的同时收集论文及其引用次数(因此MATCH (p:Paper)-[:WRITTEN_BY]->(a:Author)
WITH a, p, size((p)-[:CITED_BY]->()) as numCit
WITH a, min(numCit) as minCitations
RETURN a.authorName as authorName, minCitations
ORDER BY a.authorName
:Author变量是作用域中唯一的非聚合变量)。然后,您可以取消收藏并投影:
a