簡體   English   中英

Neo4j - 基於屬性創建節點之間的關系

[英]Neo4j - Create relationship between nodes based on property

我在圖中有節點。 節點有兩種類型; 讓我們稱他們為group agroup b 我擁有group agroup b中的節點之間的關系映射,該映射基於每個節點中的name屬性。 為清楚起見,映射文件看起來有點像這樣:

(:a {name:'abc'})-[:RELATES_TO]->(:b {name:'def'}),
(:a {name:'abd'})-[:RELATES_TO]->(:b {name:'def'}),
...
(:a {name:'uvw'})-[:RELATES_TO]->(:b {name:'xyz'})

組之間的name不共享,所以我不能使用類似的名稱:

MATCH (a),(b)
WHERE a.name = b.name
MERGE (a)-[:RELATES_TO]->(b)

由於現有節點包含多個屬性,但映射僅包含name屬性,使用以下MERGE會導致生成新節點,而不是連接我現有的節點:

MERGE
(:a {name:'abc'})-[:RELATES_TO]->(:b {name:'def'}),
(:a {name:'abd'})-[:RELATES_TO]->(:b {name:'def'}),
...
(:a {name:'uvw'})-[:RELATES_TO]->(:b {name:'xyz'})

我相信可以通過手動將所有屬性添加到映射文件並運行上述合並來單獨實現每個關系,但我相信添加關系的所有信息已經存在; 我有每個關系的起點和終點。 因此,我懷疑必須有一種更優雅的方法來解決這個問題。

在我過去使用 Neo4j 的經驗中,出現上述問題是相當普遍的 -> 我不清楚我是否缺少一些語法知識,這是一個簡單的解決方法,或者我是否濫用 Neo4j 的操作方式,我需要重新考慮我是如何進行的。

問題可能是由於您MERGE了整個模式,這將導致創建整個模式。 假設name屬性作為唯一鍵,我建議你試試這個:

// make sure you have a list of a,b combinations, resulting from previous processing
a,b
'abc','def'
'abd','def'
...
'uvw','xyz''

// process these combinations
WITH a,b
MERGE (a:a {name:a})
MERGE (b:b {name:b})
MERGE (a)-[:RELATES_TO]->(b)

請注意,在name屬性上創建一個CONSTRAINT會加快速度

首先 - 創建節點:

create
(:a {name:'abc'}),
(:a {name:'abd'}),
(:a {name:'uvw'}),
(:b {name:'def'}),
(:b {name:'def'}),
(:b {name:'xyz'})

第二 - 啟用多語句編輯器

導航到設置。 添加檢查以Enable multi statement query editor

第三 - 為每個關系創建匹配/合並對

分號表示查詢的結束。 這就是您利用多語句查詢編輯器的方式。

match(a:a {name:'abc'}),(b:b {name:'def'})
merge(a)-[:RELATES_TO]->(b);
match(a:a {name:'abd'}),(b:b {name:'def'})
merge(a)-[:RELATES_TO]->(b);
match(a:a {name:'uvw'}),(b:b {name:'xyz'})
merge(a)-[:RELATES_TO]->(b);

暫無
暫無

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

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