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

标签 neo4j cypher

我的上一个问题因重复而被关闭 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/

相关文章:

Neo4j 在 Cypher 查询运行中仅使用一个核心

neo4j - Cypher:循环属性和计数

python - Heroku Neo4j 问题

java - 在 Neo4j 中模拟分区

csv - 在 Cypher + Neo4j 中加载 CSV 失败 "LoadExternalResourceException: Couldn' t 在 :"加载外部资源

java - 如何提高 Neo4j 2.0 cypher/ExecutionResult 在重负载下的性能?

scala - 不支持的身份验证 token ,方案 ='none' 仅在禁用身份验证时才允许 : { scheme ='none' } - Neo4j Authentication Error

java - 如何解决 org.neo4j.kernel.StoreLockException : Could not create lock file exception?

neo4j - 通过ID删除节点的Cypher脚本是什么?

mysql - 图数据库,高效建模三节点组合关系