Neo4j 使用合并/创建唯一

Neo4j 使用合并/创建唯一,neo4j,cypher,Neo4j,Cypher,我试图创建一个唯一的节点,如果它不存在,并连接到另一个节点,如果没有关系 在本例中,我希望获取或创建2001年的年份节点。如果已经有2001节点,我想从日历创建关系[:YEAR],如果它不存在,如果没有2001节点,我想同时创建节点和关系。数据库中有一个标签日历节点 CREATE UNIQUE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; MERGE (calendar:Calendar)-[:

我试图创建一个唯一的节点,如果它不存在,并连接到另一个节点,如果没有关系

在本例中,我希望获取或创建2001年的年份节点。如果已经有2001节点,我想从日历创建关系[:YEAR],如果它不存在,如果没有2001节点,我想同时创建节点和关系。数据库中有一个标签日历节点

CREATE UNIQUE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year;

MERGE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year;
当我尝试查询时,我得到“未知错误”

使用其中一个似乎有效

MERGE (calendar:Calendar) CREATE UNIQUE (calendar)-[:YEAR]->(year:Year { number:2001} ) RETURN year;

MERGE (calendar:Calendar) MERGE (calendar)-[:YEAR]->(year:Year { number:2001} ) RETURN year;

最后两个查询之间有什么区别,为什么第一个查询不起作用?

对于第一部分,您希望使用下面提到的方法创建唯一查询。否则它将抛出错误

MATCH (calendar:Calendar)
CREATE UNIQUE (calendar)-[:YEAR]->(year:Year {number: 2001 }) 
RETURN year;
现在,对于第二个查询,您不需要使用createunique,因为MERGE的任务是同时匹配和创建UNIQUE

MERGE (calendar:Calendar)-[:YEAR]->(year:Year { number:2001} ) RETURN year;
以上内容将创建任何不存在的节点、关系和标签,同时重用已经存在的内容


有关Cypher MERGE的更多信息:

有时neo4j浏览器会将异常和错误屏蔽为“未知错误”。尝试在Neo4JShell中运行查询以查看真正的问题。(我认为最新版本的neo4j浏览器可以让您看到更多错误,您使用的是哪个版本的neo4j?)

第一个查询失败,因为
CREATE UNIQUE
需要从某个绑定标识符开始,至少需要绑定一个标识符(即“this”/matter/individual)。你能行

MATCH (calendar:Calendar)
CREATE UNIQUE calendar-[:YEAR]->(year:Year {number:2001})
RETURN year
我不知道为什么第二个查询失败,它本身并没有错。但是,它不会执行您想要的操作,因为
MERGE
会匹配或创建整个模式。如果
(:Calendar)-[:YEAR]>(:YEAR{number:2001})
存在,它将匹配并返回它,如果它不存在,则创建整个模式,包括一个新的日历节点。由于查询可能会创建重复项,因此本例中的“未知错误”是否会掩盖模式唯一性约束的某些问题

第三个查询首先绑定日历节点,这意味着createunique子句有一个绑定标识符,可以正常工作

第四个查询类似地将分别获取或创建这两个模式,这意味着不会创建重复的日历节点

你有没有考虑过像这样为日历建模?这与你的问题无关,但我想我可能会这样做

(:Calendar)-[:2014]->({data:"some year data"})-[:02]->({data:"some month data"})-[:25]->({data:"some day data"})

webadmin控制台显示错误消息。从第二个查询中,我得到了“SyntaxException:不知何故,Cypher无法从您的查询中构造有效的执行计划”。不管怎样,正如您所说,该查询是不好的。我不认为其他日历模型对我有效,我将日、年和月与事件链接,以查看哪些事件在何时发生,我认为当前模型更适合于此。