使用MERGE / CREATE UNIQUE

时间:2014-02-24 21:35:29

标签: neo4j cypher

如果不存在,我正在尝试创建一个唯一的节点,如果没有关系,则将其连接到另一个节点。

在这个例子中,我想获得或创建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;

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

2 个答案:

答案 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