首页 > 解决方案 > neo4j 是否有可能限制收集的数据?

问题描述

我的 neo4j 数据库中有两种类型的节点:用户和帖子。用户与帖子相关 -[:OWNER]-> 我的目标是通过 id 查询用户,他们的帖子和帖子应该受到限制(例如 LIMIT 10)。是否可以使用 COLLECT 方法限制它们并按某些参数排序?

MATCH (c:Challenge)<-[:OWNER]-(u:User) 
WHERE u.id IN ["c5db0d7b-55c2-4d6d-ade2-2265adee7327", "87e15e39-10c6-4c8d-934a-01bc4a1b0d06"] 
RETURN u, COLLECT(c) as challenges

标签: node.jsdatabaseneo4jcypher

解决方案


您可以使用切片表示法来指示您只想获取集合的前 10 个元素:

MATCH (c:Challenge)<-[:OWNER]-(u:User) 
WHERE u.id IN ["c5db0d7b-55c2-4d6d-ade2-2265adee7327", "87e15e39-10c6-4c8d-934a-01bc4a1b0d06"] 
RETURN u, COLLECT(c)[..10] as challenges

或者,您可以使用 APOC 的聚合函数:

MATCH (c:Challenge)<-[:OWNER]-(u:User) 
WHERE u.id IN ["c5db0d7b-55c2-4d6d-ade2-2265adee7327", "87e15e39-10c6-4c8d-934a-01bc4a1b0d06"] 
RETURN u, apoc.agg.slice(c, 0, 10) as challenges

APOC 方法应该更有效,但请先尝试两种方法,看看哪种方法最适合您。

编辑

至于排序,这必须在聚合之前发生,所以在你需要的东西上使用 WITH,ORDER BY ,然后再执行你的聚合。

如果您没有看到好的结果,我们可能需要使用 LIMIT,但由于我们希望每u行而不是所有行,您需要在apoc.cypher.run()子查询中使用它(这将是一个独立的查询,每u,所以我们将被允许以这种方式使用 LIMIT ):

MATCH (u:User) 
WHERE u.id IN ["c5db0d7b-55c2-4d6d-ade2-2265adee7327", "87e15e39-10c6-4c8d-934a-01bc4a1b0d06"] 
CALL apoc.cypher.run("MATCH (c:Challenge)<-[:OWNER]-(u) WITH c ORDER BY c.name ASC LIMIT 10 RETURN collect(c) as challenges", {u:u}) YIELD value
RETURN u, value.challenges as challenges

推荐阅读