簡體   English   中英

Neo4j多對一關系

[英]Neo4j Many to 1 Relationship

我目前有兩個節點,分別稱為“ friend”和“ friendOfAFriend”,我想顯示多對一關系,其中許多“朋友”都是“ friends_to”,只有1個“ friendOfFriend”。 唯一的例外是,當“朋友”只能轉到1個“ friendofAFriend”時,我只希望“朋友”轉到“ friendsOfFriend”。 我有一個csv文件,其中提取了“ friends”和“ friendOfAFriends”的名稱,但是有些朋友可以轉到多個不同的“ friendsOfAFriends”,因此我想避免這種情況。 這是我當前的代碼:

MERGE(f:Friend{name:csv.name}) 
MERGE(fo:FriendOfAFriend{name:csv.fof}) 
OPTIONAL MATCH (f:f)-[fr:friend_to]->(fo:fo)
CREATE (f)-[newf:friend_to]->(newfo:fo)
RETURN f, new, fewfo

如果有人能向我指出正確的方向,讓我僅顯示“朋友”,而這些朋友只能以多對一關系與一個“ FriendOfAFriend”聯系,我將不勝感激。 現在,它當前正在顯示我的csv中的每個“朋友”(復制朋友列表)並轉到每個“ FriendOfAFriend”。

您的數據位於CSV文件中,而尚未在neo4j DB中,因此,為了避免在數據庫中存儲不必要的節點和關系,您將必須編寫一個查詢,將所有CSV數據讀入內存,過濾掉不需要的數據在內存中,最后將所需的數據存儲到DB中。 這絕對是可以做到的,但不是必須的,如果CSV文件太大,可能會導致內存不足的情況。

我建議您分兩步做您想做的事。 首先,只需從CSV文件中創建所有節點和關系,而不過濾掉任何內容(並省略您的OPTIONAl MATCH子句,該子句除了浪費時間外什么也不做)。

其次,刪除不需要的節點和關系:

MATCH (f:Friend)
WHERE SIZE((f)-[:friend_to]->(:FriendOfAFriend)) > 1
FOREACH(p IN (f)-[:friend_to]->(:FriendOfAFriend) | DELETE RELATIONSHIPS(p)[0])
DETACH DELETE f;

WHERE子句是一種快速的度檢查,可有效地查找具有多於1個傳出的friend_to關系的Friend節點。 FOREACH子句將刪除不需要的friend_to關系,而DETACH DELETE子句將刪除不需要的Friend節點(以及它們可能具有的任何剩余關系)。

[順便說一下,您的數據模型(同時具有FriendFriendOfAFriend )似乎是錯誤的,但這是另一個問題。]

暫無
暫無

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

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