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框架内最好地解决这个问题?
答案 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语句中创建节点,而不是匹配现有节点。