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 如何将一个节点的属性和关系移动到另一个节点?_Neo4j_Cypher - Fatal编程技术网

Neo4j 如何将一个节点的属性和关系移动到另一个节点?

Neo4j 如何将一个节点的属性和关系移动到另一个节点?,neo4j,cypher,Neo4j,Cypher,我在图中有两个独立的节点,在某一点我会得到一个信号,这两个节点实际上应该是一个。因此,我必须合并这两者,包括它们的属性(没有重叠),并且我还应该维护它们之间的关系 示例图:(d)->(a{id:1}),(b)->(c{name:“Sam”}) 期望的结果:(d)->(a{id:1,名称:“Sam”}),(b)->(a{id:1,名称:“Sam”}) 标签a不一定是结果中的实际情况-关键是我们将只有一个节点代表最初的两个节点 以下内容合并了这些属性 MATCH (a:Entity {id:"1"}

我在图中有两个独立的节点,在某一点我会得到一个信号,这两个节点实际上应该是一个。因此,我必须合并这两者,包括它们的属性(没有重叠),并且我还应该维护它们之间的关系

示例图:
(d)->(a{id:1}),(b)->(c{name:“Sam”})

期望的结果:
(d)->(a{id:1,名称:“Sam”}),(b)->(a{id:1,名称:“Sam”})

标签
a
不一定是结果中的实际情况-关键是我们将只有一个节点代表最初的两个节点

以下内容合并了这些属性

MATCH (a:Entity {id:"1"}), (c:Entity {name:"Sam"})
SET a += c
但我似乎找不到一种方法来移动/复制这些关系

规格:

  • 这两个节点将不具有相同的属性
  • 节点
    a
    可能具有传入和传出关系
  • 节点
    c
    可能具有传入关系,而不是传出关系
有什么想法吗

更新:

假设节点
c
的类型和属性是预先知道的,则执行以下操作。我可以改进它以使其更具活力吗

MATCH (a:Entity {id1:"1"}), (c:Entity {id2:"2"})
SET a += c
WITH a, c
MATCH (c)<-[r]-(b)
WITH a, c, r, b
MERGE (b)-[:REL_NAME {prop1:r.prop1, prop2:r.prop2}]->(a)
WITH c
DETACH DELETE c

在节点之间移动关系时的问题是无法动态设置关系类型

因此,您无法
匹配节点
c
中的所有关系,并在节点
a
上重新创建它们。这不起作用:

MATCH (a:Entity {id1:"1"}), (c:Entity {id2:"2"})
WITH a, c
// get rels from node c
MATCH (c)-[r]-(b)
WITH a, c, r, b
// create the same rel from node a
MERGE (b)-["r.rel_type" {prop1:r.prop1, prop2:r.prop2}]->(a)
对于neo4j 3,有一些所谓的过程,它们是服务器的插件,可以通过Cypher查询调用。
apoc
程序包提供了执行所需操作的程序:

首先在服务器上安装apoc插件,然后使用以下方法:

// create relationships with dynamic types
CALL apoc.create.relationship(person1,'KNOWS',{key:value,…​}, person2)

// merge nodes
CALL apoc.refactor.mergeNodes([node1,node2])

这可能会工作合并(b)-[r2:REL_NAME]->(a)设置r2=rCheers@Evgen更好。更新3中的查询中a+=c和r2+=r的意思是什么?这很好知道-谢谢Martin!不幸的是,我使用的是<3.0。那么,使用neo4j<3.0动态创建关系类型是不可能的吗?我认为在neo4j<3.0中使用密码查询是不可能的。
// create relationships with dynamic types
CALL apoc.create.relationship(person1,'KNOWS',{key:value,…​}, person2)

// merge nodes
CALL apoc.refactor.mergeNodes([node1,node2])