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

st1*_*led 8 neo4j graph-databases cypher

我正在使用Neo4j CE 3.1.1,我和作者之间有书面关系.我想找到作者数量最多的N(例如N = 10)书籍.根据我发现的一些例子,我提出了查询:

MATCH (a)-[r:WRITES]->(b)
RETURN r,
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

当我在Neo4j浏览器中执行此查询时,我得到了10本书,但这些书看起来不像大多数作者写的那些,因为它们只向作者展示了一些WRITES关系.如果我将查询更改为

MATCH (a)-[r:WRITES]->(b)
RETURN b,
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

然后我得到了最多作者的10本书,但我没有看到他们与作者的关系.为此,我必须编写其他查询,明确说明我在上一个查询中找到的书的名称:

MATCH ()-[r:WRITES]->(b)
WHERE b.title="Title of a book with many authors"
RETURN r
Run Code Online (Sandbox Code Playgroud)

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

Inv*_*con 11

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

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

您可以通过几种不同的方式重写它.

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

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

如果关系本身对您有意义,您可以随时收集作者及其关系.

编辑

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

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

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