【问题标题】:Difficulty using UNWIND in Neo4j在 Neo4j 中使用 UNWIND 的困难
【发布时间】:2021-04-10 15:55:15
【问题描述】:

我对 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: {"

任何帮助将不胜感激。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    问题出在这一行:

    WITH collect(n) AS nodes
    

    您已经匹配到序列号在 1-31 之间的所有 :OUTPT 节点,但是您将它们聚合到一个大集合中,然后将它们合并到一个节点中。

    如果要根据序号收集节点,那么序号(在你的情况下为cnt)需要作为聚合的分组键:

    WITH cnt, collect(n) AS nodes
    

    这将为您提供每个不同的 cnt 值的一行,其中关联行上具有相同计数的节点列表。

    由于 Cypher 操作按行执行,因此您的 APOC 重构调用将按行执行。因为每一行都与不同的 cnt 值相关联,并且每一行都有不同的列表,所以您将分别对每个列表执行重构。

    输出将是每个 cnt 值一行,每行有一个节点(作为将该行列表中的所有节点合并为一个节点的结果)。

    【讨论】:

    • 非常感谢您的回答。这完全符合我的要求。
    • 我想我误解了 UNWIND 的工作原理。我认为 UNWIND 充当迭代器,并在 UNWIND 31 次后循环代码。我没有意识到它将 1-31 聚合成一行。再次感谢您的帮助,尤其是详尽的解释
    • 这有点不同。所有的 UNWIND 都是 collect() 的反面。对于集合中的每个元素,它会发出一行。 Cypher 操作每行执行一次,所以效果看起来像一个迭代。但是像 collect() 这样的聚合不受此限制,因为它们根据分组键收集多行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多