在Neo4j中模拟开窗SQL函数

时间:2019-02-28 09:42:53

标签: neo4j

我有以下查询可检索研究人员每篇论文的前2篇论文(以引用次数计):

C/user> scrapy runspider myFile.py

我从中得到的输出是:

MATCH (p:Paper)-[:SUBMITTED_TO]->(a:Proceeding),(p)-[:CITED_BY]->()
WITH p.paperTitle as Paper, size((p)-[:CITED_BY]->()) as numCitations, 
collect(distinct a.proceedingName) as Proceedings
UNWIND Proceedings AS Proceeding
WITH Paper, numCitations, Proceeding
ORDER BY Paper, numCitations, Proceeding
RETURN Paper, numCitations, collect(Proceeding) as Proceedings
ORDER BY Proceedings, numCitations DESC

我现在想要做的是仅获取每个程序中出现的所有论文中的前2个(所有论文中的前三个),但是如果我在末尾使用 LIMIT 2 查询中,我只会得到所有结果的前2个(而不是每个过程的前2个):

Paper      numCitations     Proceedings
Title1     4                Proc1
Title2     3                Proc1
Title3     2                Proc1
Title4     7                Proc2
Title5     5                Proc2
Title6     3                Proc2
Title7     8                Proc3
Title8     4                Proc3
Title9     2                Proc3

请注意,Proc1已被完全丢弃。这不是我想要的。关于在Neo4j中如何执行此操作的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是我在族谱中用来查询一组男人中两个年龄最大的孩子(由其RN识别)的查询:

match (p:Person)<-[:father]-(c:Person) where p.RN in [5,7,27]
with p, c order by c.BD
with p.RN as RN,collect(c.fullname) as cC
return RN,cC[0..2]

类推,您可以按numCitations(而不是生日)对数据进行排序,然后将结果限制为2。