所以,我上周一直在努力争取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"}]
}
我已经尝试了更多的变化而不是我想重新计算。
答案 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})