【问题标题】:Neo4j Many to 1 RelationshipNeo4j 多对一关系
【发布时间】:2019-06-19 17:53:20
【问题描述】:

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

【问题讨论】:

    标签: neo4j cypher many-to-one


    【解决方案1】:

    您的数据在 CSV 文件中,而不是在 neo4j 数据库中,因此,为了避免在数据库中存储不需要的节点和关系,您必须编写一个查询,将所有 CSV 数据读入内存,过滤掉内存中不需要的数据,最后将需要的数据存储到数据库中。这绝对可以做到,但可能没有必要,如果 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 子句是一种快速度数检查,可有效查找具有多个外向friend_to 关系的Friend 节点。 FOREACH 子句将删除不需要的 friend_to 关系,DETACH DELETE 子句将删除不需要的 Friend 节点(以及它们可能拥有的任何剩余关系)。

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

    【讨论】:

    • 您好,谢谢您的建议。 FOREACH 语句中的 p 是指“friend_to”关系吗?我尝试了该查询,但我仍然收到拥有多个friendOfAFriends的朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2022-01-06
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多