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 |