Cypher获得限制为一定数量的节点列表的传出关系

时间:2017-06-14 14:48:44

标签: neo4j cypher

我有一些:book。书籍由ISBN标识,并与相关图书有:similar关系。这是我的密码查询,以获得与提供的ISBN列表相似的书籍:

MATCH (b:Book)-[:SIMILAR]-(c:Book) 
WHERE b.ISBN in $ISBNs
return b, c

但是,我想将每本书的类似书籍数量限制为5本,而不限制总书数。换句话说,如果我提供一定的ISBN列表,我目前在一本书上有7个相似,在另一本书上有6个相似,而在一个书上有3个相似。我想限制为每本书5,所以我得到5,5和3.我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

将您的查询更改为:

MATCH (b:Book)-[:SIMILAR]-(c:Book) 
WHERE b.ISBN in $ISBNs
RETURN {book:b, similars: collect(c)[..5]}

此查询使用collect()功能将所有类似的图书收集到列表中。它将返回一个带有book键的投影,其中包含主要图书和similars密钥,其中包含一系列限制为5本图书的类似图书。

答案 1 :(得分:1)

使用APOC程序,您可以限制每行匹配结果的数量,而不是将限制应用于总行。

请参阅此knowledge base article了解如何使用apoc.cypher.run()实现此目的。

如果您不能使用APOC程序,您可以使用Bruno的答案,该答案占用了集合的有限部分。