将所有关系移动/复制到不同的节点

时间:2015-01-16 13:09:10

标签: neo4j cypher

有没有办法将关系从一个节点复制或移动到另一个节点?

我的情况类似于此处:

neo4j merge 2 or multiple duplicate nodes

在这里:

Copy relationships of different type using Cypher

假设我在图表中有这种模式

(a)-[r:FOO]->(b)
(a)<-[r2:BAR]-(c)

然后我有另一个节点(d),它可能是(a)的副本,也可能不是r:FOO的副本。我的想法是,从功能的角度来看节点是否重复并不重要。我希望能够移动或复制关系r2:BAR(d)-[r:FOO]->(b) (d)<-[r2:BAR]-(c) ,以便图表现在包含

(a)

如果我在复制时合并节点,那么我希望能够移动关系而不是复制,然后(可能选择)删除// get all outgoing relationships MATCH (a:Label1 { title : 'blah' })-[r]->(o) RETURN r // returns FOO and BAR // for each relationship type, create one from (d) and copy the properties over MATCH (a:Label1 { title : 'blah' })-[r:FOO]->(o), (d:Label1 { title : 'blah blah' }) CREATE (d)-[r2:FOO]->(o) SET r2 = r ...etc... // now do the same for incoming relationships MATCH (a:Label1 { title : 'blah' })<-[r]-(o) RETURN r // returns FOO and BAR // for each relationship type, create one from (d) and copy the properties over MATCH (a:Label1 { title : 'blah' })<-[r:FOO]-(o), (d:Label1 { title : 'blah blah' }) CREATE (d)<-[r2:FOO]-(o) SET r2 = r ...etc... // finally delete node and relationships (if required) MATCH (a:Label1 { title : 'blah' })-[r]-(o) DELETE r, a 。请注意,有多种关系类型,我不确定类型是什么。我意识到我可以分阶段做到这一点,但是如果在一个密码查询中有一种有效的方法可以做到这一点会很棒。我目前的策略是(不是确切的语法,只是给出一个想法)

(a)

然而,这依赖于许多查询,因此依赖于事务。 (在我的简单视图中)能够在一个查询中实现这一点是更可取的。但是,我不相信密码中存在这样的东西。我错了吗?

有什么想法吗?如果不清楚,请告诉我,我将进一步详细说明和解释。

有关信息,我使用的是Neo4j 2.1.6社区版(使用.NET应用程序中的neo4jclient)。

刚才意识到我必须重复我的过程来解释关系的方向,除非我弄错了?即从(d)获取所有传出关系,将其重新创建为从{{1}}传出,然后对所有传入关系执行相同操作。上面的Cypher已经相应编辑。

更新:我猜这是一个白日梦,而且根本不可能。谁能证实这一点?即使它是“不!”,最好有一个确定的答案。如果是这样,我会考虑询问Neo4j这些人是否可行并且值得考虑。

更新2:由于缺乏想法,我猜这是不可能完成的。我当然没有进一步的研究或实验。看起来像功能请求是要走的路。我不可能是唯一一个会发现此功能特别有用的人。

1 个答案:

答案 0 :(得分:0)

我认为你可以把它们连在一起:

// get all relationships
MATCH
  (a:Label1 { title : 'blah' })-[r]-(o),
  (d:Label1 { title : 'blah blah' })
CREATE (d)-[r2:type(r)]-(o)
DELETE r, a

我唯一不能完全确定的是能够使用type()函数在那里使用它的地方。我现在就试试吧