gpt4 book ai didi

neo4j - 为什么 MERGE 有时会创建重复关系?

转载 作者:行者123 更新时间:2023-12-02 04:03:04 26 4
gpt4 key购买 nike

我的上一个问题因重复而被关闭 Confused about MERGE sometimes creating duplicate relationship ,但是我无法找到解决方案,这涉及重复的关系,而不是重复的节点。

当用户访问另一个用户的个人资料时,我有一个查询

    MATCH (you:User {user_id: { myId }}), (youVisited:User {user_id: { id }})
MERGE (you)-[yvr:VISITED]->(youVisited)
SET yvr.seen = false, yvr.created_at = timestamp()
RETURN yvr.created_at as visited_at

我注意到,在极少数情况下,会发生重复的 [:VISITED] 关系。对于 (1057)-[:VISITED]->(630),两者具有相同的属性,并且无论如何都应该只有一个 [:VISITED] (下次用户访问时,只需MERGE [:VISITED] 并更新 [:VISITED {created_at: ..., saw: false }] 相同 User 节点之间:

{
created_at: 1485800172734,
seen: false
}

enter image description here

我认为MERGE有什么意义可以防止这种情况发生?显然不是,那么为什么会发生这种情况以及如何确保这种情况不会发生?

我还查过其他一些东西,但我不确定这些信息是否可靠或最新。例如:http://neo4j.com/docs/developer-manual/current/cypher/clauses/create-unique/ ,我应该使用 CREATE UNIQUE 来代替吗?我认为 MERGE 是一个更好的替代品。

最佳答案

我同意在某些情况下,MERGECREATE UNIQUE可用于相同目的。 MERGE不取代CREATE UNIQUE然而。

例如,MERGE允许多个匹配,并且其模式必须完全匹配图表才能被视为匹配 - 它只会重复部分匹配; CREATE UNIQUE另一方面,在多个匹配上会出错,并允许部分匹配 - 它将尝试重新使用图表的现有部分并添加缺少的部分。

docs 中所述,在关系的独特性方面似乎也存在差异,即您正在经历的事情:

MERGE might be what you want to use instead of CREATE UNIQUE. Note however, that MERGE doesn’t give as strong guarantees for relationships being unique.

我将让 Neo4j 的开发人员来解释这些保证到底是什么。我只能说,在你的具体情况下,CREATE UNIQUE似乎比 MERGE 更合适无论如何:如果您的意图是只允许单个 VISITED一个用户与另一个用户的关系 - 他的最后访问 - 以及多个 VISITED关系违反了您的数据模型,那么请务必使用 CREATE UNIQUE记录此意图,并同时在数据库级别强制执行。

在这种情况下,人们可能会认为 VISITED这种关系的命名也不是特别好,因为它意味着可能有更多关系:每次一个用户访问另一个用户的个人资料时就有一个关系。

关于neo4j - 为什么 MERGE 有时会创建重复关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com