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

Neo4j:查询以查找关系最多的节点及其连接的节点,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我使用的是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

我使用的是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

我做错了什么?为什么第一个查询没有按预期工作?

您已经非常接近了:排序后,有必要重新查找作者。例如:

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
匹配(a:作者)-[r:写]->(b:书)
和b一起,
计数(r)为作者计数
按作者排序计数说明限制10

匹配(b)聚合仅具有基于非聚合列的上下文,并且对于您的匹配,唯一的关系只会在结果中出现一次

因此,您的第一个查询是询问行上的每个关系,以及该特定关系的计数,即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

您可以收集作者和/或返回关系,这取决于您需要从输出中获得什么。

我尝试了这个查询,它也可以工作。我没有大数据,但不知何故,我觉得它的可伸缩性不如公认答案中的第一个(只有一个匹配子句,而不是2)。但是,我不是neo4j内部工作/优化方面的专家,这项工作也做得很好。@st1led您可以随时分析查询以确保。这就是说,第二场比赛是在10号限制之后,所以它没有第一场那么重,所以表演应该是相似的。当然!虽然您可能希望首先分析查询,但我给出的第一个查询可能不会像在更大的图上收集大量数据那样性能优异。