如果不存在,我正在尝试创建一个唯一的节点,如果没有关系,则将其连接到另一个节点。
在这个例子中,我想获得或创建2001年的Year节点。如果已经存在2001节点,我想从日历创建关系[:YEAR],如果它不存在,如果没有2001节点,我想创建节点和关系。 db中有一个标签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;
最后两个查询之间有什么区别,为什么第一个查询不起作用?
答案 0 :(得分:1)
有时neo4j-browser会将异常和错误屏蔽为“未知错误”。尝试在neo4j-shell中运行查询以查看真正的问题。 (我认为最新版本的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})
存在,它将匹配并返回它,如果它不存在则创建整个模式,包括新的日历节点。由于查询可能会创建重复项,在这种情况下,“未知错误”是否会掩盖模式唯一性约束的某些问题?
第三个查询首先绑定日历节点,这意味着create unique子句具有绑定标识符,并且可以正常工作。
第四个查询同样会分别获取或创建两个模式,这意味着不会创建重复的日历节点。
您是否考虑过将日历建模为更像这样的东西?这与你的问题无关,但我认为这可能就是我的意思。
(:Calendar)-[:2014]->({data:"some year data"})-[:02]->({data:"some month data"})-[:25]->({data:"some day data"})
答案 1 :(得分:0)
对于第一部分,您可能希望使用下面提到的方式创建唯一。否则会引发错误。
MATCH (calendar:Calendar)
CREATE UNIQUE (calendar)-[:YEAR]->(year:Year {number: 2001 })
RETURN year;
现在对于第二个查询,您不需要使用CREATE UNIQUE,因为MERGE可以同时处理MATCH和CREATE UNIQUE。
MERGE (calendar:Calendar)-[:YEAR]->(year:Year { number:2001} ) RETURN year;
以上将创建不存在的任何节点,关系和标签,同时重用已存在的节点,关系和标签。
有关Cypher MERGE的更多信息:here