正确使用 UNWIND 和 COLLECT

Correct use of UNWIND and COLLECT

我正在尝试在 Neo4j 的 Cypher UNWIND 中收集每次迭代的 ID 列表。像往常一样,COLLECT 正在收集 UNWIND 的所有 ID,然后将所有内容作为一个向量返回。但我正在寻找向量的向量。

MATCH (property:Product)<-[:HAS_PRODUCT]-(s1:Session)
WHERE property.products_id = 12345
with distinct s1.session_id as session_id
limit 2
with collect (session_id) as session_ids


unwind session_ids as session_id
MATCH (property:Product)<-[contains:CONTAINS]-(target:Session {session_id: session_id})
with collect(distinct id(property)) as vector
return vector

输出:

[22238, 33110, 25626, 51257]

session_ids 是 2 session_ids 的列表。每个 session_id 应该产生一个向量,所以对于 2 session_ids 我希望得到向量的向量。

如果我 运行 这两个会话只有一个(即没有 UNWIND),我会得到这样的预期结果

[22238, 51257]
[22238, 25626, 51257]

这就是我想要的 UNWIND。是否有任何解决方法只为 UNWIND.

的每次迭代收集 ID

所以您缺少的部分是分组键在聚合中的工作方式。非聚合术语充当分组键,为将要发出的行以及应用聚合的行提供上下文。

您的 collect() 聚合没有其他项,因此没有分组键,您最终得到一个列表。

如果您希望 collect() 按 session_id 应用,则需要将 session_id 作为非聚合项包括在内,以便它可以作为聚合的分组键:

...
unwind session_ids as session_id
MATCH (property:Product)<-[contains:CONTAINS]-(target:Session {session_id: session_id})
with session_id, collect(distinct id(property)) as vector
return vector

这意味着根据 session_id,您为每个会话收集产品节点的不同 ID。

如果需要,您可以在 RETURN 中省略 session_id。这些行已经根据您在 WITH 子句中执行的聚合以您想要的状态构建,因此即使您省略 session_id,您仍然会有 2 行结果,一个会话的向量在一行上,以及下一行中另一个会话的向量。