Neo4j 使用合并/创建唯一
我试图创建一个唯一的节点,如果它不存在,并连接到另一个节点,如果没有关系 在本例中,我希望获取或创建2001年的年份节点。如果已经有2001节点,我想从日历创建关系[:YEAR],如果它不存在,如果没有2001节点,我想同时创建节点和关系。数据库中有一个标签日历节点Neo4j 使用合并/创建唯一,neo4j,cypher,Neo4j,Cypher,我试图创建一个唯一的节点,如果它不存在,并连接到另一个节点,如果没有关系 在本例中,我希望获取或创建2001年的年份节点。如果已经有2001节点,我想从日历创建关系[:YEAR],如果它不存在,如果没有2001节点,我想同时创建节点和关系。数据库中有一个标签日历节点 CREATE UNIQUE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; MERGE (calendar:Calendar)-[:
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无法从您的查询中构造有效的执行计划”。不管怎样,正如您所说,该查询是不好的。我不认为其他日历模型对我有效,我将日、年和月与事件链接,以查看哪些事件在何时发生,我认为当前模型更适合于此。