在密码Neo4j中从一个查询到另一个查询的管道结果

时间:2019-02-27 22:46:42

标签: neo4j cypher

以下查询将返回研究人员列表以及他们撰写的相应论文列表。在每篇论文旁边,每篇论文被其他论文所引用的次数。

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索引(但我首先需要此输入)。 谢谢!!!

1 个答案:

答案 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