我有一些节点(n1)和(n2)具有相同的名称但是具有唯一的属性并且共享节点对关系(s1) - [r] - >(e1)如下:
我正在尝试一次性创建s1和e1之间的新关系,以便新关系是唯一的,基于n1和n2的id,但这些关系与之前的关系具有相同的类型,并且然后删除旧关系:
我找到了以下内容:neo4j cypher: how to change the type of a relationship,它引导我进入以下查询:
MATCH (e1)<-[:ENDS_WITH]-(n {name:"same"})-[:STARTS_WITH]->(s1),
(s1)-[r]->(e1)
CREATE (s1)-[r2:NEWREL]->(e1)
// copy properties and set n_id unique
SET r2 = r, r2.n_id = n.n_id
WITH r
DELETE r
具有完美的感觉。但是,当我在Neo4j Web界面数据浏览器中尝试此操作时,n_id属性设置正确,但类型(r2)设置为字符串&#34; NEWREL&#34;而不是预期的&#34; REL&#34;
我在NEWREL
周围尝试回传,并从类型(r)传递一个临时变量。不工作。
答案 0 :(得分:1)
[增订]
Cypher只允许您使用硬编码类型创建关系,因此通常无法实现您想要的效果。
但是,如果您事先知道所有可能的关系类型,则有一种解决方法。在以下示例中,假设可能的关系类型为REL1
,REL2
,REL3
和REL4
:
MATCH (e1)<-[:ENDS_WITH]-(n {name:"same"})-[:STARTS_WITH]->(s1)-[r]->(e1)
WITH s1, e1, r, n,
CASE TYPE(r)
WHEN 'REL1' THEN {rel1:[1]}
WHEN 'REL2' THEN {rel2:[1]}
WHEN 'REL3' THEN {rel3:[1]}
WHEN 'REL4' THEN {rel4:[1]}
END AS todo
FOREACH(x IN todo.rel1 | CREATE (s1)-[rr:REL1]->(e1) SET rr = r, rr.n_id = n.n_id)
FOREACH(x IN todo.rel2 | CREATE (s1)-[rr:REL2]->(e1) SET rr = r, rr.n_id = n.n_id)
FOREACH(x IN todo.rel3 | CREATE (s1)-[rr:REL3]->(e1) SET rr = r, rr.n_id = n.n_id)
FOREACH(x IN todo.rel4 | CREATE (s1)-[rr:REL4]->(e1) SET rr = r, rr.n_id = n.n_id)
DELETE r
FOREACH
子句中只有一个实际上会创建一个新关系(正确类型)并复制现有属性。
以上解决方案适用于neo4j 3.0,但neo4j 2.3似乎有一个错误,导致查询失败。如果您在r
关系中没有任何值得复制的属性,则将所有SET rr = r, rr.n_id = n.n_id
条款更改为SET rr.n_id = n.n_id
应该避免2.3上的问题。
答案 1 :(得分:0)
所以问题是你的关系类型是NEWREL
而不是REL
?在第3行中,您指定的类型为:CREATE (s1)-[r2:NEWREL]->(e1)
。只需将其更改为CREATE (s1)-[r2:REL]->(e1)
。