2016-06-23 54 views
1

我在圖中有兩個單獨的節點,並且在某一點上,我會得到一個信號,表明這兩個節點實際上應該是一個節點。所以我必須合併這兩個包括他們的屬性(沒有重疊),我也應該保持關係。如何將一個節點的屬性和關係移動到另一個節點?

示例圖:(d)->(a {id:1}), (b)->(c {name:"Sam"})

期望的結果:(d)->(a {id:1, name:"Sam"}), (b)->(a {id:1, name:"Sam"})

標籤a不必真的是這樣的結果 - 重點是,我們將只有一個節點的代表原來的兩個。

以下合併屬性正常。

MATCH (a:Entity {id:"1"}), (c:Entity {name:"Sam"}) 
SET a += c 

但我似乎無法找到移動/複製關係的方法。

的規格:

  • 這兩個節點將不具有相同的屬性
  • 節點a可以有傳入和傳出的關係
  • 節點c可以有傳入的關係,非傳出

有什麼想法?

更新:

以下作品,假設類型和來節點c特性預先已知的。我可以改善這一點,使其更具活力嗎?

MATCH (a:Entity {id1:"1"}), (c:Entity {id2:"2"}) 
SET a += c 
WITH a, c 
MATCH (c)<-[r]-(b) 
WITH a, c, r, b 
MERGE (b)-[:REL_NAME {prop1:r.prop1, prop2:r.prop2}]->(a) 
WITH c 
DETACH DELETE c 

更新2: 上面有時會拋出unable to load relationship with id錯誤,我不知道爲什麼,但似乎/它關係到閱讀的同時書寫。

更新3: 這是錯誤周圍的工作:

MATCH (a:Entity {id1:"1"}), (c:Entity {id2:"2"}) 
SET a += c 
WITH a, c 
MATCH (c)<-[r]-(b) 
WITH a, c, r, b 
MERGE (b)-[r2:REL_NAME]->(a) 
SET r2 += r 
WITH r, c 
DELETE r, c 
+2

這可能會實現合併(二) - [R2:REL_NAME] - >(a)設置r2 = r – Evgen

+0

乾杯@Evgen這樣好多了。 – Motasim

+0

更新3中查詢中的a + = c和r2 + = r是什麼意思? – Aqqqq

回答

1

的問題移動節點之間的關係時,你不能動態設置的關係類型。

所以你不能MATCH節點c的所有關係,並在節點a重新創建它們。這確實工作:

MATCH (a:Entity {id1:"1"}), (c:Entity {id2:"2"}) 
WITH a, c 
// get rels from node c 
MATCH (c)-[r]-(b) 
WITH a, c, r, b 
// create the same rel from node a 
MERGE (b)-["r.rel_type" {prop1:r.prop1, prop2:r.prop2}]->(a) 

隨着Neo4j的3有所謂的這些都爲服務器插件,可以從Cypher支架查詢被調用的過程。該apoc程序包提供你需要的是什麼程序:https://neo4j-contrib.github.io/neo4j-apoc-procedures/

首先在服務器上安裝的APOC插件,然後使用類似:

// create relationships with dynamic types 
CALL apoc.create.relationship(person1,'KNOWS',{key:value,…​}, person2) 

// merge nodes 
CALL apoc.refactor.mergeNodes([node1,node2]) 
+0

非常好知道 - 謝謝Martin!不幸的是我正在使用<3.0。那麼在neo4j <3.0時動態地創建關係類型是不可能的? – Motasim

+0

我認爲neo4j <3.0中的Cypher查詢是不可能的。 –

相關問題