neo4j - 在 Neo4j 中使用 UNWIND 的困难
问题描述
我对 Neo4j 很陌生,所以这可能是一个简单的问题。我有数百个具有属性“seq”(用于序列)的节点。这个数字基本上代表了一个月中的哪一天。因此,所有这几百个节点的 seq 属性都在 1 到 31 之间。我想将所有具有相同 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))“CALL apoc.refactor.mergeNodes(nodes, {properties: {"
任何帮助,将不胜感激。
解决方案
问题在于这一行:
WITH collect(n) AS nodes
您已经匹配到所有 :OUTPT 节点,其序列号在 1-31 之间,但随后将它们聚合到一个大集合中,然后将它们合并到一个节点中。
如果要根据序列号收集节点,则序列号(在您的情况下为cnt
)需要是聚合的分组键:
WITH cnt, collect(n) AS nodes
这将为您提供每个不同cnt
值的一行,其中关联行上具有相同计数的节点列表。
因为 Cypher 操作按行执行,所以您的 APOC 重构调用将按行执行。因为每一行都与不同的 cnt 值相关联,并且每一行都有不同的列表,所以您将分别对每个列表执行重构。
输出将是每个 cnt 值一行,每行有一个节点(由于将该行列表中的所有节点合并到一个节点中)。
推荐阅读
- ios - 如何在 android-studio 中生成 .ipa 文件?
- android - 如何有效地隐藏 ClusterManager 中不在 Circle 半径内的每个标记/集群?
- python - 使用 pyinstaller 和 scipy 模块将 py 文件转换为 exe 文件时出错。知道可能是什么问题吗?
- javascript - findByPrimary 不是函数
- javascript - ajax PUT 不传输数组
- powerbi - How to apply CONTAINS clause on hierarchical categories to create scenario analysis in Power BI
- python - 我有如果程序中的条件在那个条件下那个确切的值是什么?
- postgresql - comma seperated string used as column of a table
- python - While循环不更新值
- python - 正则表达式中 {} 符号的 OR 条件