我在关系属性上遇到了 REMOVE 的奇怪行为。即使在查询执行后,该属性也不会被删除。 temp用于 CASE 条件检查。之后我必须删除该属性,因此没有发生。
这是我的问题:
MERGE (a { word:"aut" })-[r:jsim]->(b { word:"et" })
ON
CREATE SET r.temp = FALSE ON
MATCH SET r.temp = TRUE
WITH r,
CASE r.val
WHEN r.temp
THEN [a]
ELSE [] END AS toDo UNWIND toDo AS a
MATCH (a)-[s]->(b { word:"voluptas" })
SET r.val = s.val
WITH r, r.temp AS result
REMOVE r.temp
RETURN r
这是测试的console。请一些人找到我失踪的地方。
Afetr一些建议我将查询更改为:
MERGE (a { word:"aut" })-[r:jsim]->(b { word:"et" })
ON
CREATE SET r.temp = -1
WITH r,
CASE
WHEN r.temp = -1
THEN [a]
ELSE [] END AS toDo UNWIND toDo AS a
MATCH (a)-[s]->(b { word:"voluptas" }) RETURN a
此处,转发的节点a也未被返回,审核一词出现在我的图表中,连接到a。
答案 0 :(得分:3)
要删除r.temp
,MATCH (a)-[s]->(b { word:"voluptas" })
应与您共享的控制台匹配,它看起来不会,因此查询的其余部分将不会被执行。这包括设置您在r.val
中使用的CASE
。
你的意图MERGE (a { word:"aut" })-[r:jsim]->(b { word:"et" })
是否正确?您似乎有两个带有word =“aut”的节点,但这可能是您所期望的。
根据已修改的问题进行更新
您希望找到通过合并创建/匹配的word:"voluptas"
和word:"aut"
之间的关系。但是,没有这种关系。
执行
MATCH (b { word:"voluptas" })-[r]-(c { word:"aut" })
RETURN b,r,c
向具有word:"aut"
的节点返回一个关系,但这是在合并中创建的 不是同一节点 。您会发现此图表中有两个word:"aut"
节点。
所以,我假设这不是你所期望的。您可以将查询更改为首先合并节点,然后更改它们之间的关系,以确保在这两个已存在的节点之间只有一个关系。您的更新查询现在看起来像
MERGE (a { word:"aut" })
MERGE (b { word:"et" })
MERGE (a)-[r:jsim]->(b)
ON
CREATE SET r.temp = -1
WITH r,
CASE
WHEN r.temp = -1
THEN [a]
ELSE [] END AS toDo UNWIND toDo AS a
MATCH (a)-[s]->(b { word:"voluptas" })
RETURN a
请记住,MERGE不会查看部分模式 - 它将匹配整个模式或创建它。由于它无法匹配整个模式,因此即使存在word:"aut"
的节点,也会创建它,即节点和关系。