Neo4j多对一关系

时间:2019-01-25 21:28:22

标签: neo4j cypher many-to-one

我目前有两个节点,分别称为“ 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”。

1 个答案:

答案 0 :(得分:0)

您的数据在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关系的friend_to节点。 FOREACH子句将删除不需要的friend_to关系,而DETACH DELETE子句将删除不需要的Friend节点(以及它们可能具有的任何剩余关系)。

[顺便说一下,您的数据模型(同时具有FriendFriendOfAFriend)似乎是错误的,但这是另一个问题。]