1

最初のリレーションシップを削除する前に、ノードから別のノードにすべてのインゴーイング リレーションシップとアウトゴーイング リレーションシップ (プロパティを含む) を転送しようとしています。どちらも同じラベルです。

議論はここから始まりました: 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
4

2 に答える 2

2

ああ、エラーが表示されたので、元の回答の何が問題だったのかがわかったと思います。私はあなたの他の解決策も見ていきますが、元のものを修正する方法は次のとおりです(SETの後にブレークを追加することによりCREATE):

# Assuming node already loaded
node_query = Neo4j::Session.query.match(node: {neo_id: node.neo_id}, new_node: {neo_id: new_node.neo_id})

types = node_query.match('node-[rel]-()').pluck('DISTINCT type(rel)')

types.each do |type|
  node_query.match('node-[rel:#{type}]->(other)').
    where('other <> new_node').
    with(:node, :new_node, :rel, :other).
    create("new_node-[new_rel:#{type}]->other").
    break.set('new_rel = rel').exec

  node_query.match('node<-[rel:#{type}]-(other)').
    where('other <> new_node').
    with(:node, :new_node, :rel, :other).
    create("new_node<-[new_rel:#{type}]-other").
    break.set('new_rel = rel').exec
end
于 2015-02-02T09:42:10.100 に答える