尝试创建幂等Cypher查询

时间:2015-04-20 20:44:02

标签: rest neo4j cypher idempotent

所以,我上周一直在努力争取cypher,试图获得一个幂等查询,删除连接到给定根的所有类型的节点,然后只创建与参数一样多的节点。问题是删除实际上没有删除任何东西,或者每次执行查询时节点开始以令人头晕的速度倍增。一次迭代设法在失败之前创建超过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"}]
}

我已经尝试了更多的变化而不是我想重新计算。

1 个答案:

答案 0 :(得分: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})