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

标签 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: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/

相关文章:

graph-databases - 从 OrientDB 检索 OrientVertex 对象

database - 图遍历 : How do I query for "friends and friends of friends" using Gremlin

windows - Neo.ClientError.Procedure.ProcedureNotFound Neo4j Windows 桌面版

neo4j - 在列表的连续元素之间创建关系

Neo4j 聚合和求和

ruby-on-rails - 参数错误 : Invalid session type: :server_db (expected one of [:http, :bolt,:嵌入])

postgresql - 如何导入或同步数据到Neo4?

database - Neo4j 的引用完整性

neo4j - neo4j中根据父关系查找节点

nosql - 图数据库解决了关系数据库中的哪些难题?