繁体   English   中英

cypher Neo4j 中从一个查询到另一个查询的管道结果

[英]Pipeline result from one query to another in cypher Neo4j

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

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-index(但我首先需要这个输入)。 谢谢!!!

看起来您很接近,您只需要确保使用与之前相同的变量 ( numCit ),并确保您对numCit的计算是针对每位作者每篇论文的引用次数,因此您需要在其中包含p您的 WITH 子句,因为聚合是根据非聚合变量分组的。

使用 :CITED_BY 关系的 size() 而不是将它们放在您的模式中也会更有效,因为这使用更有效的度计算(节点知道按类型/方向的关系数),但是您只能如果只有 :Paper 节点可以相互引用,请执行此操作(如果有其他类型的节点可以引用论文,则无法进行此优化)。 这也确保您考虑没有任何引用的论文。

您的查询将如下所示:

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

编辑

为了同时返回作者的最小引用次数以及每篇论文的一行和引用次数,您需要在计算最小值的同时收集论文及其引用次数(因此a :作者变量是作用域中唯一的非聚合变量)。 然后,您可以展开集合并进行投影:

MATCH (p:Paper)-[:WRITTEN_BY]->(a:Author)
WITH a, p, size((p)-[:CITED_BY]->()) as numCit
WITH a, min(numCit) as minCitations, collect(p {.title, numCit}) as papers
UNWIND papers as paper
RETURN a.authorName as authorName, minCitations, paper.title as title, paper.numCit as numCit
ORDER BY authorName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM