NEo4j - 删除关系属性不起作用

时间:2015-10-28 06:18:48

标签: neo4j cypher

我在关系属性上遇到了 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。

1 个答案:

答案 0 :(得分:3)

要删除r.tempMATCH (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"的节点,也会创建它,即节点和关系。