簡體   English   中英

根據節點之間的現有關系創建節點之間的關系

[英]Create a relationship between nodes based on existing relationship between the nodes

我在兩個用戶之間有多種關系,如下所示:

(u1:User)-[:BR]-(b:Buyer {value:"A"})-[:BR]-(u2:User)
(u1:User)-[:BR]-(b:Buyer {value:"B"})-[:BR]-(u2:User)
(u1:User)-[:BR]-(b:Buyer {value:"C"})-[:BR]-(u2:User)

我想將它們全部組合成兩個用戶之間的單一關系(同時保留舊關系),同時保留節點的值以創建列表並設置為新關系的值,如下所示:

(u1:User)-[:R {data:["A", "B", "C"]}]-(u2:User)

有什么辦法嗎?

編輯:關鍵詞可以出現不止一次。

這是我的測試數據。 我創建了具有不同場景的示例數據。 問題是 u1 和 u2 具有非定向關系,因此您將獲得從 u1 到 u2 和 u2 到 u1 的重復路徑。

CREATE (u1:User)
CREATE (u2:User)
CREATE (u3:User)
CREATE (ba:Buyer {value:"A"})
CREATE (bb:Buyer {value:"B"})
CREATE (bc:Buyer {value:"C"})
CREATE (bd:Buyer {value:"D"})
MERGE (u1)-[:BR]-(ba)-[:BR]-(u2)
MERGE (u1)-[:BR]-(bb)-[:BR]-(u2)
MERGE (u1)-[:BR]-(bc)-[:BR]-(u2)
MERGE (u2)-[:BR]-(bb)-[:BR]-(u3)
MERGE (u2)-[:BR]-(bd)-[:BR]-(u3)

Step1是保證u1和u2不一樣。 然后收集不同的值並按此值對其進行排序。 然后我創建了所有節點的集合以生成行號(稱為 uw 或行)。 然后僅為偶數行創建關系,以便沒有重復項。 最后,使用值作為數據創建從 u1 到 u2 的關系。

MATCH (u1:User)-[:BR]-(b:Buyer)-[:BR]-(u2:User) where u1 <> u2
WITH u1, u2, collect(distinct b.value) as v  order by v
WITH collect([u1,u2,v]) as cols 
UNWIND range(1, size(cols)) as uw 
WITH uw as row, cols[uw-1][0] as u1, cols[uw-1][1] as u2, cols[uw-1][2] as values WHERE row%2=0
MERGE (u1)-[:R {data: values}]-(u2)

結果: 在此處輸入圖像描述

我不知道這是否是最有效的方法,但我可以使用以下命令實現此目的:

match (u1:User)-[:BR]-(b:Buyers)-[:BR]-(u2:User) with u1, u2, collect(b.value) as bys merge (u1)-[:R {data:bys}]-(u2)

編輯:然后刪除與以下內容的重復關系:

match (u1:User {userid:"622f0137d799ed4369b077e1"})-[r:R]->(u2)-[:R]->(u1)
DELETE r

暫無
暫無

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

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