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

cee*_*eej 6 neo4j cypher

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

我的情况与此类似:

neo4j合并2个或多个重复节点

和这里:

使用Cypher复制不同类型的关系

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

(a)-[r:FOO]->(b)
(a)<-[r2:BAR]-(c)
Run Code Online (Sandbox Code Playgroud)

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

(d)-[r:FOO]->(b)
(d)<-[r2:BAR]-(c)
Run Code Online (Sandbox Code Playgroud)

如果我在复制时合并节点,那么我希望能够移动关系而不是复制,然后(可能选择)删除(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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Bri*_*ood 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
Run Code Online (Sandbox Code Playgroud)

我唯一不完全确定的是是否能够在type()使用该函数的地方使用该函数。我现在就尝试一下