最初のリレーションシップを削除する前に、ノードから別のノードにすべてのインゴーイング リレーションシップとアウトゴーイング リレーションシップ (プロパティを含む) を転送しようとしています。どちらも同じラベルです。
議論はここから始まりました: Neo4j Cypher:ノードを別のノードに置き換える前にすべての関係を転送します
node_query = Neo4j::Session.query.match(old_node: {uuid: node1.uuid}).match(new_node: {uuid: node2.uuid})
types = node_query.match('node-[rel]-()').pluck('DISTINCT type(rel)')
types.each do |type|
node_query.match('old_node-[rel]->(other)').with(:old_node, :rel, :other).create("new_node-[new_rel]->other").set('new_rel = rel').exec
node_query.match('old_node<-[rel]-(other)').with(:old_node, :rel, :other).create("new_node<-[new_rel]-other").set('new_rel = rel').exec
end
それを実装しようとすると、このエラーが発生します
new_rel not defined (line 1, column 160)
"MATCH
(old_node {uuid: "YYYY"}),
(new_node {uuid: "XXXX"}),
oldnode-[rel]->(other)
WITH old_node, rel, other SET new_rel = rel
CREATE new_node-[new_rel]->other" ^
Neo4j::ActiveRel rel でのみ機能する別の方法を試しました。他のものには to_node プロパティがないためです。とにかく関係プロパティをコピーしないようです:
relations = old_node.rels(dir: :outgoing)
relations.each do |rel|
if defined? rel.to_node
new_node.create_rel(rel.type, rel.to_node, rel.props)
end
end
relations = self.rels(dir: :incoming)
relations.each do |rel|
if defined? rel.from_node
rel.from_node.create_rel(rel.type, new_node, rel.props)
end
end