尝试创建一个幂等的 Cypher 查询

Trying to create an idempotent Cypher query

所以,上周我一直在与密码作斗争,试图获得一个幂等查询,该查询删除所有附加到给定根的节点类型,然后只创建与参数中一样多的节点。问题是删除实际上不会删除任何东西,或者每次执行查询时节点都开始以令人眼花缭乱的速度增加。在失败之前,一次迭代设法创建了 10000 多个重复节点。我正在尝试将其用于 REST API 中的 PUT 请求。我在 Node.js 中使用 Seraph 库,但我只是使用它提供的基本密码查询。

这是查询的最新迭代:

  var query = " MATCH (title:TITLE {sku: {sku}})" +
" OPTIONAL MATCH (title)-[r_GTIN]->(old_GTIN:GTIN)" +
" WITH title, r_GTIN, old_GTIN" +
" DELETE r_GTIN, old_GTIN" +
" WITH title" +
" CREATE (gtin:GTIN {gtins})" +
" MERGE (title)-[:has_GTIN]->(gtin);";

下面是示例参数:

{
sku: "ABC12345"
gtins: [{number: "999-999-999", type: "firstKind"},
        {number: "888-888-888", type: "secondKind"},
        {number: "777-777-777", type: "thirdKind"}]
}

我已经尝试了比我想描述的更多的变体。

我能够接受你的查询并稍微修改它并让它执行我认为你想要的。不同之处在于删除节点后,只有不同的标题会传递到查询中的下一个子句。

如果没有 distinct,您可能会将同一 title 节点的多个匹配项传递给查询中的 create 子句,从而导致多次创建相同的节点。

with [{number: "999-999-999", type: "firstKind"},
 {number: "888-888-888", type: "secondKind"},
 {number: "777-777-777", type: "thirdKind"}] as new_gtins
match (title:TITLE {sku: 'ABC12345'})
optional match title-[r:has_GTIN]->(gtin:GTIN)
delete r, gtin
with distinct title as title, new_gtins 
unwind new_gtins as new_gtin
create title-[:has_GTIN]->(gtin:GTIN {type: new_gtin.type, number: new_gtin.number})