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

时间:2017-02-14 23:34:27

标签: 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本书,但这些书看起来不像大多数作者写的那些,因为它们只向作者展示了一些WRITES关系。如果我将查询更改为

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

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

2 个答案:

答案 0 :(得分:10)

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

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

您可以通过几种不同的方式重写此内容。

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

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

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

修改

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

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

您可以收集作者和/或返回关系,具体取决于您对输出的需求。

答案 1 :(得分:1)

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

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