在删除第一个节点之前,我试图将所有进入和离开的关系(包括其属性)从一个节点转移到另一个节点。他们都有相同的标签。
讨论从这里开始: Neo4j Cypher : transfer all relationships before replacing a node by another
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 rels的方法,因为其他人没有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
答案 0 :(得分: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
答案 1 :(得分:1)
关于你的其他解决方案,我对rels
方法并不太熟悉(我似乎无法找到它),但我想它会返回CypherRelationship
或{{1对象。我实际上有点惊讶它只有在定义ActiveRel
模型时才有效,因为如果没有定义它,它应该返回ActiveRel
个对象。
我对您的问题的猜测是,您可能需要使用CypherRelationship
和start_node
而不是end_node
和from_node
。我们应该标准化......
编辑:我正在编辑这个以添加Neo4j :: Server :: CypherRelationship,当它不是ActiveRel时返回。没有start_node也没有来自节点:
to_node
}