2017-02-14 331 views
3

我正在使用Neo4j CE 3.1.1,并且我与作者和书籍之间存在关系WRITES。我想找到作者数量最多的N(例如N = 10)书籍。下面的一些例子,我发现,我想出了查询:Neo4j:查询找到具有最多关系的节点及其连接的节点

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 

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

回答

3

聚合只有基于非聚集列背景,并与你的对手,一个独特的关系将只在搜索结果中出现一次。

所以,你的第一个查询请求行上的每个关系,以及特定关系的数量,这是1

你可能会在几个不同的方式重写这个。

之一是收集作者和订单上的作者列表的大小:

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

您可以随时收集作者及其关系,如果关系本身有趣的是你。

编辑

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

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

您可以收集关于作者和/或返回的关系为好,这取决于你的输出需要。

+0

非常感谢! – st1led

+0

当然可以!虽然你可能想要首先分析查询,但我给出的第一个可能不会像表格一样,因为它会在大图上进行大量的收集。 – InverseFalcon

0

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

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 
+0

我试过这个查询,它也可以。我没有大数据,但不知何故,我觉得它比可接受的答案中的第一个可扩展性低(只有一个MATCH子句与2个比较)。但是,我不是neo4j内部工作/优化方面的专家,而且这也很好。 – st1led

+0

@ st1led您可以随时对查询进行PROFILE确认。也就是说,第二场比赛是在第10场比赛之后,所以它不像第一场比赛那么重,所以表演实际上应该都是相似的。 – InverseFalcon

相关问题