重复的节点和关系

时间:2019-01-12 11:01:15

标签: neo4j cypher

我有一个函数,每次访问链接时都会创建一个VISIT节点。我还将一些统计信息附加到此访问节点,例如DATE,BROWSER,OS等。

但是有时“日期”节点(或者可能还有其他节点)会重复,这意味着一次VISIT会得到2个日期节点。

每个VISIT只能附加到一个stats节点。 (例如,一个浏览器,一个日期)

这是我的代码:

MATCH (l:URL { id: $id })
CREATE (v:VISIT)
MERGE (b:BROWSER { browser: $browser })
MERGE (c:COUNTRY { country: $country })
MERGE (o:OS { os: $os })
MERGE (r:REFERRER { referrer: $referrer })
MERGE (d:DATE { date: $date })
MERGE (v)-[:VISITED]->(l)
MERGE (v)-[:BROWSED_BY]->(b)
MERGE (v)-[:LOCATED_IN]->(c)
MERGE (v)-[:OS]->(o)
MERGE (v)-[:REFERRED_BY]->(r)
MERGE (v)-[:VISITED_IN]->(d)
RETURN l

这是图形图像示例,VISIT(红色节点)应仅具有一个VISITED_IN关系,并且仅与该类型的一个节点有关。

duplicated nodes imag

1 个答案:

答案 0 :(得分:1)

合并不是ThreadSafe。它基本上连续执行三件事,但是会遇到并发问题: 1.检查模式是否存在 2.如果没有创建它 3.退回

如果两个合并请求同时具有相同的模式,则不能保证将仅创建一个。

您应该将合并请求与唯一约束结合在一起,以确保唯一性

CREATE CONSTRAINT ON (d:Date) ASSERT d.date IS UNIQUE