Neo4J中使用UNWIND插入通用实体

问题描述 投票:0回答:1

不久前,我发表了这篇文章,内容是关于在 Neo4J 数据库中插入通用实体时类似节点的匹配问题。建议的解决方案是不使用 MERGE 而是执行以下操作:

OPTIONAL MATCH (p:Position)
WHERE PROPERTIES(p) = $props
CALL {
  WITH p
  WITH p WHERE p IS NULL
  CREATE (q:Position)
  SET q = $props
  RETURN q AS result
  UNION
  WITH p
  WITH p WHERE p IS NOT NULL
  RETURN p AS result
}
RETURN ID(result)

现在我想使用 UNWIND 像这样一次创建多个实体

UNWIND $positions as props
OPTIONAL MATCH (p:Position)
WHERE PROPERTIES(p) = props
CALL {
  WITH p
  WITH p WHERE p IS NULL
  CREATE (q:Position)
  SET q = $props
  RETURN q AS result
  UNION
  WITH p
  WITH p WHERE p IS NOT NULL
  RETURN p AS result
}
RETURN ID(result)

但是,当 $positions 列表中有相同的属性时,如下所示:

[{symbol: "xxx", name: "yyy", location:"zzz", effective: false},
{symbol: "xxx", name: "yyy", location:"zzz", effective: false}]

然后,创建两个相等的节点。如何防止重复节点的创建?

neo4j cypher graph-databases
1个回答
0
投票

您只需要使用

WITH DISTINCT props
来删除重复项:

UNWIND $positions as props
WITH DISTINCT props
OPTIONAL MATCH (p:Position)
WHERE PROPERTIES(p) = props
CALL {
  WITH p, props
  WITH p, props WHERE p IS NULL
  CREATE (q:Position)
  SET q = props
  RETURN q AS result
  UNION
  WITH p
  WITH p WHERE p IS NOT NULL
  RETURN p AS result
}
RETURN ID(result)

此查询还修复了原始查询中的一些其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.