0

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

这是查询的最新迭代:

  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"}]
}

我已经尝试了更多的变化,而不是我想重新描述的。

4

1 回答 1

1

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

如果没有,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})
于 2015-04-21T03:13:07.887 回答