关于cypher:Neo4j:查询以查找关系最多的节点及其连接的节点

Neo4j: Query to find the nodes with most relationships, and their connected nodes

我正在使用Neo4j CE 3.1.1,作者和书籍之间存在写关系。我想找到作者数量最多的N本书(例如N = 10)。在找到一些示例之后,我想到了以下查询:

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

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

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

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

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

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


聚合仅具有基于非聚合列的上下文,并且根据您的匹配,唯一关系将仅在您的结果中出现一次。

因此,您的第一个查询要查询一行中的每个关系,以及该特定关系的计数,即1。

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

一种方法是收集作者并按照作者列表的大小排序:

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

如果您对关系本身很感兴趣,可以随时收集作者及其关系。

编辑

如果您的节点上碰巧有标签(您的节点上绝对应该有标签),则可以尝试通过与所有书籍匹配,获取与每本书的传入:WRITES关系的大小,顺序和大小来尝试不同的方法。对此进行限制,然后与作者进行匹配:

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

您可以根据需要从输出中收集作者和/或返回关系。


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

1
2
3
4
5
6
7
8
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