不久前,我发表了这篇文章,内容是关于在 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}]
然后,创建两个相等的节点。如何防止重复节点的创建?
您只需要使用
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)
此查询还修复了原始查询中的一些其他问题。