Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j-更改关系类型在web界面数据浏览器中不起作用_Neo4j_Cypher - Fatal编程技术网

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

Neo4j-更改关系类型在web界面数据浏览器中不起作用,neo4j,cypher,Neo4j,Cypher,我有一些节点(n1)和(n2),它们具有相同的名称但具有唯一的属性,并且共享节点对关系(s1)-[r]->(e1),如下所示: 我正在尝试一次性创建s1和e1之间的新关系,以便新关系是唯一的,基于n1和n2的id,但这些关系的类型与以前的关系相同,然后删除旧关系: 我发现以下内容:引导我进行以下查询: MATCH (e1)<-[:ENDS_WITH]-(n {name:"same"})-[:STARTS_WITH]->(s1), (s1)-[r]->(e1) CREATE

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

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

我发现以下内容:引导我进行以下查询:

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
匹配(e1)(s1),
(s1)-[r]->(e1)
创建(s1)-[r2:NEWREL]->(e1)
//复制属性并将n_id设置为唯一
设置r2=r,r2.n\u id=n.n\u id
带r
删除r
这很有道理。但是,当我在Neo4j web界面数据浏览器中尝试此操作时,n_id属性设置正确,但类型(r2)设置为字符串“NEWREL”,而不是预期的“REL”


我试着在
NEWREL
周围打勾,并从type(r)传递一个临时变量。不工作。

所以问题是关系类型是
NEWREL
而不是
REL
?在第3行中,指定类型:
CREATE(s1)-[r2:NEWREL]->(e1)
。只需将其更改为
CREATE(s1)-[r2:REL]->(e1)

[更新]

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
匹配(e1)(s1)-[r]->(e1)
s1,e1,r,n,
案例类型(r)
当'REL1'时,则{REL1:[1]}
当'REL2'时,则{REL2:[1]}
当'REL3'时,则{REL3:[1]}
当'REL4'时,则{REL4:[1]}
如此而已
FOREACH(todo.rel1 | CREATE(s1)-[rr:rel1]->(e1)设置rr=r,rr.n_id=n.n_id)
FOREACH(todo.rel2 | CREATE(s1)-[rr:rel2]->(e1)设置rr=r,rr.n_id=n.n_id)
FOREACH(todo.rel3 | CREATE(s1)-[rr:rel3]->(e1)设置rr=r,rr.n_id=n.n_id)
FOREACH(todo.rel4中的x | CREATE(s1)-[rr:rel4]->(e1)设置rr=r,rr.n_id=n.n_id)
删除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上的问题。

William-感谢您的回复。在这种情况下,我不知道REL,查询不正确-现在通过将
(s1)-[r:REL]->(e1)
更改为
(s1)-[r]->(e1)
cybersam来修复-不确定您的意思。在前面的场景中,s1和e1之间只有一种关系。我想创建尽可能多的“父”节点关系,将每个新关系的n_id属性设置为与父节点n_id相同,然后删除原始关系。cybersam-谢谢。我将对此进行测试,因为我的关系类型数量有限。我会报告回来。cybersam-我一直收到一个错误非法状态异常有什么想法吗?是的-略有不同-我使用的不是名称,而是标签,因为所有n个节点都有如下相同的标签:`MATCH(e1)(s1)-[r]>(e1)与s1,e1,r,n,CASE TYPE(r)当'tests'时,然后{rel1:[1]}当'reduces'时,然后{rel2:[1]}当'increases'时,{rel3:[1]}结束为todo FOREACH(todo.rel1中的x创建(s1)-[rr:tests]->(e1)集合rr=r,rr.n_id=n.n_id)FOREACH(todo.rel2中的x创建(s1)-[rr:reduces]>(e1)集合rr=r,rr.n_id=n.n_id)FOREACH(todo.rel3中的x创建(s1)-[rr:reduces]>(e1)集合rr=r,rr.n_id=n)删除r’我使用neo4j 3.0进行查询,但您可能使用的是2.3,它似乎有一个bug。如果在
r
关系上没有任何值得复制的属性,请尝试将所有
SET rr=r,rr.n_id=n.n_id
子句更改为
SET rr.n_id=n.n_id