我正在使用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
我做错了什么?为什么第一个查询不按预期工作?
答案 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