Neo4j Cypher:在用另一个节点替换节点之前,转移所有关系

3
我试图将一个节点的所有入站和出站关系转移到另一个节点,然后再删除第一个节点。它们都具有相同的标签。 我看到了这个 Neo4j Cypher: copy relationships and delete node 但在我的情况下,我不知道关系的类型,并且我想转移所有入站和出站关系。 我正在寻找基于Cypher查询或基于neo4j.rb的查询。
1个回答

4

我认为纯Cypher无法实现这一点。以下是使用neo4j.rb的解决方案,我认为可以起作用:

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

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

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

我已经有了类型,但是在循环中,我不确定如何为 new_rel 指定其他节点。再次感谢 Brian;) - armedwing
只是进行编辑,因为第二个查询走错了方向,它们都需要一个“exec”。 - Brian Underwood
each 内的两行代码正在生成 Cypher 查询。方法调用链中间的 with 是生成 Cypher 子句中的 WITH 部分的原因。我不确定使用 with 是否会将一个关系的属性复制到另一个关系,但我在另一个 SO 帖子上看到有人使用了相同的技术。 - Brian Underwood
我现在已经完成了一半。我可以转移Neo4j :: ActiveRel,但不能转移未声明的关系。我尝试了另一种方法,不得不在rel.to_node上添加一个测试来知道它是否是Neo4j :: ActiveRel。我仍然不知道如何转移其他关系。`relations = self.rels(dir: :outgoing) relations.each do |rel| if defined? rel.to_node new_node.create_rel(rel.type, rel.to_node, rel.props) end endrelations = 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` - armedwing
确实,已完成: http://stackoverflow.com/questions/28274009/neo4j-rb-transfer-all-relationships-before-replacing-a-node-by-another - armedwing
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接