Neo4j - 改变关系类型在Web界面数据浏览器中不起作用

时间:2016-03-17 17:58:15

标签: neo4j cypher

我有一些节点(n1)和(n2)具有相同的名称但是具有唯一的属性并且共享节点对关系(s1) - [r] - >(e1)如下: before

我正在尝试一次性创建s1和e1之间的新关系,以便新关系是唯一的,基于n1和n2的id,但这些关系与之前的关系具有相同的类型,并且然后删除旧关系: after

我找到了以下内容: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)传递一个临时变量。不工作。

2 个答案:

答案 0 :(得分:1)

[增订]

Cypher只允许您使用硬编码类型创建关系,因此通常无法实现您想要的效果。

但是,如果您事先知道所有可能的关系类型,则有一种解决方法。在以下示例中,假设可能的关系类型为REL1REL2REL3REL4

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)