【问题标题】:Avoid creating multiple relationships for each match避免为每个匹配创建多个关系
【发布时间】:2020-05-23 03:07:45
【问题描述】:

我有以下模型,每个User 都通过AUTHORED 关系链接到几个Comment 节点,每个评论都有一个flair 属性,每个评论可以不同。我也有一个Flair 节点,并希望在User 节点和Flair 节点之间建立新的关系。

+--------+                          +---------+
|        |                          |         |
|  User  +------+ REL:AUTHORED+-----+ Comment |
|        |                          |         |
+--------+                          +---------+

所以我编写了以下查询来尝试执行此操作,但它导致每个 Comment 节点的 User 节点的关系具有正确的天赋。我只想要这些节点之间的单一关系。我如何做到这一点?

MATCH (a:User)-[:AUTHORED]-(c:Comment),(b:Flair)
WHERE c.flair = 'foo' and b.name = 'foo'
CREATE (a)-[r:VOTES_FOR]->(b)
RETURN type(a,b,r)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    为避免创建重复关系,您应该使用MERGE 而不是CREATE

    MATCH (a:User)-[:AUTHORED]->(c:Comment), (b:Flair)
    WHERE c.flair = 'foo' AND b.name = 'foo'
    MERGE (a)-[r:VOTES_FOR]->(b)
    RETURN a, b, r
    

    此查询还删除了TYPE 函数的使用,因为您的查询非法使用了它。

    但我还应注意,您通过添加VOTES_FOR 关系将冗余数据引入数据库。相反,我建议从Comment 节点中删除flair 属性,并将其替换为CommentFlair 节点之间的关系。以下查询应该实现这一点(并且还可以避免在多个位置冗余存储相同的信息)。此外,它处理所有的天赋值(不仅仅是“foo”):

    MATCH (u:User)-[:AUTHORED]->(c:Comment), (f:Flair)
    WHERE c.flair = f.name
    REMOVE c.flair
    MERGE (c)-[:FOR_FLAIR]->(f)
    RETURN u, c, f
    

    或者,更有效的是,如果您真的不需要返回 User

    MATCH (c:Comment), (f:Flair)
    WHERE c.flair = f.name
    REMOVE c.flair
    MERGE (c)-[:FOR_FLAIR]->(f)
    RETURN c, f
    

    使用这种新的数据模型,您可以找到用户以这种方式创作的所有不同的 Flair:

    MATCH (user:User)-[:AUTHORED]->()-[:FOR_FLAIR]->(flair)
    WHERE user.id = 123
    RETURN user, COLLECT(DISTINCT flair) AS flairs
    

    【讨论】:

      【解决方案2】:

      您想使用MERGE 而不是CREATE 在这些节点之间仅建立一个关系。

      MATCH (a:User)-[:AUTHORED]-(c:Comment),(b:Flair)
      WHERE c.flair = 'foo' and b.name = 'foo'
      MERGE (a)-[r:VOTES_FOR]->(b)
      RETURN type(a,b,r)
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多