neo4j中的CREATE UNIQUE生成重复的节点

时间:2016-02-09 10:50:06

标签: neo4j

根据neo4j documentation

  

CREATE UNIQUE位于MATCH和CREATE的中间 - 它将匹配   它能做什么,并创造缺失的东西。 CREATE UNIQUE将永远   使图表的变化最小 - 如果它可以使用的部分   现有的图表,它会。

这听起来不错,但CREATE UNIQUE似乎没有遵循“最不可能的变化”。规则。例如,这里有一些Cypher可以创建两个人:

CREATE (n:Person {name: 'Alice'})

CREATE (n:Person {name: 'Bob'})

CREATE INDEX ON :Person(name)

以及这两个CREATE UNIQUE语句,用于在这些人之间建立关系。由于两个人已经存在于图表中,因此只应新创建关系:

MATCH (a:Person {name: 'Alice'}) 
CREATE UNIQUE (a)-[:knows]->(b:Person {name: 'Bob'}) 
RETURN a

MATCH (a:Person {name: 'Alice'}) 
CREATE UNIQUE (a)<-[:knows]-(b:Person {name: 'Bob'}) 
RETURN a

在此之后,图表看起来应该是

(Alice)<---KNOWS--->(Bob). 

但是当你运行MATCH查询时:

MATCH (a:Person) 
RETURN a

现在看来图表似乎是

(Bob)   

(Bob)--KNOWS-->(Alice)--KNOWS-->(Bob); 

已经创建了两个额外的Bobs。

我看了一下其他Cypher命令,但似乎没有一个用于此用例:如果B存在,在现有节点A和现有节点B之间创建链接,否则在现有节点A和a之间创建链接新创建的节点B.如何在Cypher框架内最好地解决这个问题?

2 个答案:

答案 0 :(得分:1)

此查询应该执行您想要的操作(如果您始终希望在两个节点之间使用单个knows关系):

MATCH (a:Person {name: 'Alice'})
MERGE (b:Person {name: 'Bob'})
MERGE (a)-[:knows]->(b)
RETURN a;

答案 1 :(得分:0)

以下是使用CREATE UNIQUE

执行此操作的方法
MATCH (a:Person {name: 'Alice'}), (b:Person {name:'Bob'}) 
CREATE UNIQUE (a)-[:knows]->(b), (b)-[:knows]->(a)

您需要2个匹配子句,否则您始终在CREATE UNIQUE语句中创建节点,而不是匹配现有节点。