簡體   English   中英

neo4j:用一個節點替換具有相同屬性的多個節點

[英]neo4j: Replace multiple nodes with same property by one node

假設我在neo4j中有一個節點的屬性“名稱”。 現在我想通過識別具有相同名稱的所有節點來強制執行給定名稱的最多一個節點。 更准確地說:如果有三個名稱為“dog”的節點,我希望它們只被一個名為“dog”的節點替換,其中:

  1. 從所有原始三個節點收集所有屬性。
  2. 是否所有弧都附加到原始的三個節點。

其背景如下:在我的圖中,通常有幾個同名的節點應被視為“相等”(盡管有些節點具有比其他節點更豐富的屬性信息)。 a.name = b.name放在WHERE子句中的速度非常慢。

編輯:我忘了提到我的Neo4j目前是版本2.3.7(我無法更新)。

第二個編輯:節點和可能的弧有一個已知的標簽列表。 節點的類型是已知的。

第三次編輯:我想從Java調用上面的“節點崩潰”過程,因此Cypher查詢和過程代碼的混合也將是一個有用的解決方案。

我認為你需要類似節點的同義詞。

1)遍歷所有節點並創建節點同義詞:

MATCH (N)
WITH N
  MERGE (S:Synonym {name: N.name})
  MERGE (S)<-[:hasSynonym]-(N)
RETURN count(S);

2)僅使用一個節點刪除同義詞:

MATCH (S:Synonym)
WITH S
MATCH (S)<-[:hasSynonym]-(N)
WITH S, count(N) as count
WITH S WHERE count = 1
DETACH DELETE S;

3)其余同義詞的傳輸屬性和關系(使用apoc ):

MATCH (S:Synonym)
WITH S
MATCH (S)<-[:hasSynonym]-(N)
WITH [S] + collect(N) as nodesForMerge
CALL apoc.refactor.mergeNodes( nodesForMerge );

4)刪除Synonym標簽:

MATCH (S:Synonym)<-[:hasSynonym]-(N)
CALL apoc.create.removeLabels( [S], ['Synonym'] );

我用以下模式制作了一個測試用例:

CREATE (n1:TestX {name:'A', val1:1})
CREATE (n2:TestX {name:'B', val2:2})
CREATE (n3:TestX {name:'B', val3:3})
CREATE (n4:TestX {name:'B', val4:4})
CREATE (n5:TestX {name:'C', val5:5})

MATCH (n6:TestX {name:'A', val1:1}) MATCH (m7:TestX {name:'B', val2:2}) CREATE (n6)-[:TEST]->(m7)
MATCH (n8:TestX {name:'C', val5:5}) MATCH (m10:TestX {name:'B', val3:3}) CREATE (n8)<-[:TEST]-(m10)

結果如下:

在此輸入圖像描述

節點B實際上是相同的節點。 這是我的解決方案:

//copy all properties
MATCH (n:TestX), (m:TestX) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, m SET n += m;

//copy all outgoing relations
MATCH (n:TestX), (m:TestX)-[r:TEST]->(endnode) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, collect(endnode) as endnodes
FOREACH (x in endnodes | CREATE (n)-[:TEST]->(x));

//copy all incoming relations
MATCH (n:TestX), (m:TestX)<-[r:TEST]-(endnode) WHERE n.name = m.name AND ID(n)<ID(m) WITH n, collect(endnode) as endnodes
FOREACH (x in endnodes | CREATE (n)<-[:TEST]-(x));

//delete duplicates
MATCH (n:TestX), (m:TestX) WHERE n.name = m.name AND ID(n)<ID(m) detach delete m;

結果輸出如下所示:

在此輸入圖像描述

必須標記您必須知道各種關系的類型。

所有屬性都從具有“較高”ID的節點復制到具有“較低”ID的節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM