Neo4J:查询以找到具有大多数关系的节点及其连接的节点



我正在使用neo4j ce 3.1.1,并且在作者和书籍之间有一段恋爱关系。我想找到n(例如n = 10)书籍,作者数量最多。按照我发现的一些示例,我想到了查询:

MATCH (a)-[r:WRITES]->(b)
RETURN r,
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10

当我在neo4j浏览器中执行此查询时,我会收到10本书,但是这些书看起来不像大多数作者写的书,因为它们仅显示少数写与作者的关系。如果我将查询更改为

MATCH (a)-[r:WRITES]->(b)
RETURN b,
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10

然后,我得到了10本书的最多作者,但我看不到他们与作者的关系。为此,我必须写其他查询,以明确说明我在上一个查询中发现的书的名称:

MATCH ()-[r:WRITES]->(b)
WHERE b.title="Title of a book with many authors"
RETURN r

我在做什么错?为什么第一个查询不按预期工作?

聚合只有基于非凝集列的上下文,并且在您的匹配项下,唯一的关系只会在您的结果中发生一次。

因此,您的第一个查询是连续要求的每个关系,而该特定关系的数量是1。

您可以以几种不同的方式重写。

一个是收集作者和作者列表大小的顺序:

MATCH (a)-[:WRITES]->(b)
RETURN b, COLLECT(a) as authors
ORDER BY SIZE(authors) DESC LIMIT 10

如果关系本身对您很有趣,您总是可以收集作者及其关系。

编辑

如果您的节点上有标签(您的节点上绝对应该有标签),则可以通过与所有书籍匹配,获得传入的大小来尝试其他方法:与每本书,订购和订购和限制这一点,然后向作者执行比赛:

MATCH (b:Book)
WITH b, SIZE(()-[:WRITES]->(b)) as authorCnt
ORDER BY authorCnt DESC LIMIT 10
MATCH (a)-[:WRITES]->(b)
RETURN b, a

您可以在作者上收集和/或返回关系,具体取决于您从输出中需要的东西。

您非常接近:排序后,有必要重新发现作者。例如:

MATCH (a:Author)-[r:WRITES]->(b:Book)
WITH b, 
     COUNT(r) AS authorsCount
     ORDER BY authorsCount DESC LIMIT 10
MATCH (b)<-[:WRITES]-(a:Author)
RETURN b, 
       COLLECT(a) AS authors
       ORDER BY size(authors) DESC

最新更新