我正在使用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
我究竟做错了什么?为什么第一个查询不能按预期运行?
最佳答案
聚合仅具有基于非聚合列的上下文,并且根据您的匹配,唯一关系将仅在您的结果中出现一次。
因此,您的第一个查询是询问一行中的每个关系,以及该特定关系的计数,即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
您可以收集作者和/或返回关系,具体取决于输出所需的内容。
关于Neo4j:查询以查找关系最多的节点及其连接的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42238183/