如何解决在 Neo4j 中使用 UNWIND 的困难
我对 Neo4j 很陌生,所以这可能是一个简单的问题。 我有数百个具有属性“seq”(用于序列)的节点。这个数字基本上代表了一个月中的哪一天。所以所有这几百个节点都有 1 到 31 之间的 seq 属性。我想将所有具有相同 seq 的节点组合成一个节点 - 这样所有 seq = 1 的节点都组合成一个“1 月 1 日”节点. seq = 2 的所有节点都被组合成一个“1 月 2 日”节点,等等。我有一个“pat_id”的属性,它将从一天的所有合并的 noes 中组合成一个数组。
这是我的代码:
WITH range(1,31) as counts
UNWIND counts AS cnt
MATCH (n:OUTPT {seq:cnt})
WITH collect(n) AS nodes
CALL apoc.refactor.mergeNodes(nodes,{properties: {
pat_id:'combine',seq:'discard'},mergeRels:true})
YIELD node
RETURN node
我最初尝试使用 FOREACH 循环来执行此操作,但我无法在 FOREACH 中执行 MATCH。 我一直在做 UNWIND,但它只是将节点与第一个值 (seq = 1) 合并。我认为这是因为 RETURN 语句结束了循环。但是当我删除 RETURN 语句时,出现此错误:
查询不能以 CALL 结束(必须是 RETURN 或更新子句)(第 5 行,第 1 列(偏移量:99)) "调用 apoc.refactor.mergeNodes(nodes,{properties: {"
任何帮助将不胜感激。
解决方法
问题出在这一行:
WITH collect(n) AS nodes
您已经匹配到序列号在 1-31 之间的所有 :OUTPT 节点,但随后您将它们聚合到一个大集合中,然后将它们合并到一个节点中。
如果你想根据序号收集节点,那么序号(在你的例子中,cnt
)需要是聚合的分组键:
WITH cnt,collect(n) AS nodes
这将为每个不同的 cnt
值获取一行,以及关联行上具有相同计数的节点列表。
因为 Cypher 操作按行执行,所以您的 APOC 重构调用将按行执行。由于每一行都与不同的 cnt 值相关联,并且每一行都有不同的列表,因此您将分别为每个列表执行重构。
输出将为每个 cnt 值一行,每行一个节点(作为将该行列表中的所有节点合并为一个节点的结果)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。