2013-04-26 279 views
2

使用Neo4j - 圖數據庫內核2.0.0-M02和新的合併功能, 我試圖將節點合併成一個新的(合併並不真正合並,但綁定到根據文檔返回標識符)並刪除舊節點。我現在只在意將要轉移到新節點的屬性而不是關係。 我目前所面對的是低於使用Neo4j合併節點到新的一個與cypher和neo4j

merge (n:User {form_id:123}) //I get the nodes with form_id=123 and label User 
with n match p=n //subject to change to have the in a collection 
create (x) //create a new node 
foreach(n in nodes(p): set x=n) //properties of n copied over to x 
return n,x 

的暗號問題 1.當的foreach運行它每n從n到x爲每次用替換所有屬性創建一個新的x 2.移動性new n 因此,如果來自合併的第n個節點具有2個屬性a,b和第二個c,d在集合x = n之後,則所有新節點都以c,d屬性結束。我知道是在文檔中說明,所以我的問題是: 有沒有辦法將一個新節點中的N個節點(也可能是關係)的所有屬性與密碼合併?

回答

1

我不認爲Cypher語言目前具有非破壞性地將任何和所有屬性從一個節點複製到另一節點的語法。

但是,我將介紹一種解決方案,以解決與您的問題類似的簡單情況。假設某些用戶節點具有屬性a & b,並且其他一些用戶節點具有c & d。例如:

CREATE (:User { id:1,a: 1,b: 2 }),(:User { id:1,c: 3,d: 4 }), 
     (:User { id:2,a:10,b:20 }),(:User { id:2,c:30,d:40 }); 

這是我們如何將「合併」具有相同ID的所有用戶節點到一個單一節點:

MATCH (x:User), (y:User) 
    WHERE x.id=y.id AND has(x.a) AND has(y.c) 
    SET x.c = y.c, x.d = y.d 
    DELETE y 
    RETURN x 

您可以在Neo4j的沙箱嘗試了這一點:http://console.neo4j.org/

0

使用Neo4j-3.x,還可以使用特定的apoc procedure將兩個節點合併爲一個節點。

首先,您需要將apoc程序jar文件下載到您的$NEO4J_HOME/plugins文件夾中,然後啓動Neo4j服務器。

然後就可以調用apoc.refactor.mergeNodes這樣:

MATCH (x:User), (y:User) 
WHERE x.id=y.id 
call apoc.refactor.mergeNodes([x,y]) YIELD node 
RETURN node 

,我可以看到它,得到的節點都有x和y的所有屬性,選擇y的值,如果同時設置。