2014-02-07 144 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

相關問題