2014-02-07 113 views
1

我试图在删除(n)之前将节点(n)的所有向内关系复制到另一个节点(m)(这两个女巫我知道ID),但我无法想出码。 这些关系可能存在也可能不存在。Neo4j Cypher:复制关系和删除节点

任何人的摘要?

回答

1

您无法从关系集合内动态创建关系类型。

假设即使我们收集所有传入的关系如下

START n=node(id1) MATCH n<-[r]-() WITH collect(r) as rels ... 

您将能够遍历集合RELS但不会能够做到以下

CREATE (n)-[rels[i]]->(m) 

所以假设所有传入关系都是相同的类型,说'foo'。然后你可以做到以下几点。

START n=node(id1),m=node(id2) 
MATCH n<-[r:foo]-(p) 
WITH collect(p) as endNodes,m 
FOREACH(i in range(0,length(endNodes)-1) | foreach(a in [endNodes[i]] | 
create m<-[:foo]-a 
)) 

在情况下,如果你的关系类型是不同的,那么你可以参考此变通手法:here。您可以从控制台进行查询,将所有startnode,endnode,relationshiptype信息作为csv下载到Excel表单中。然后运行密码脚本从中运行。

其他方式是你可以使用java api查询neo4j,然后存储所有的关系和节点,相应地构建你的查询并重新启动。

+0

这是整齐的感谢!仍然DELETE问题仍然存在,即:如果我之后尝试运行DELETE查询但之前未找到任何关系,查询是否会失败? – Sovos

+0

Neo4j api doc表示没有任何关系挂起。因此,只要你删除一个节点,所有与它对应的关系也应该被删除 –

+0

当我试图删除一个有关系的节点,它给了我一个错误。我必须删除节点和关系才能成功。假定我们知道关系类型,你看到有任何方法可以在一个查询中完成它吗? – Sovos

0

假设所有传入关系都是相同的类型说'富'。然后,你可以做短以下查询:

START n=node(id1),m=node(id2) 
MATCH n<-[r:foo]-(p) 
WITH collect(p) as endNodes,m 
FOREACH(mm in endNodes | CREATE m-[:foo]->mm) 

避免了双重的foreach

相关问题