node.js - 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
解决方案
您可以使用切片表示法来指示您只想获取集合的前 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
推荐阅读
- c# - 是否可以将 Linq.Queryable.Max 作为参数传递?
- vcpkg - 致命错误 C1083:无法打开包含文件:'ifaddrs.h':没有这样的文件或目录
- javascript - 如何在 PartialView 表单上保留 HTTPPost 操作中的数据,以在另一个 PartialView [ASP.NET] 上的 HTTPGet 操作中使用
- spring-boot - 如何在 Thymeleaf 的翻译中使用链接(锚标记)?
- python-3.x - django 自定义用户注册模型中密码重置的默认模板名称
- powershell - 用于下载 .Net Core 5.0.4 Hosting Bundle Installer 的 Powershell 命令
- git - 为什么直接在节点上运行 cmd 时 Jenkins 不能从 Git 获取?
- git - 项目解决方案正在显示 Git 文件
- python - 我无法解决这个问题“IndexError: list index out of range”
- java - 在 Prod env Java 批处理中有时会因未找到类异常而出现 NoClassdeffoundError 失败。一天或一周至少发生一次