我有预先存在的节点a
和b
,并且想要创建路径
(a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
除非它已经存在。 create unique
在这里不起作用,因为如果我们已经有了
(a) <-[:FROM]- (d:Comp) -[:TO]-> (e)
然后d
将被重复使用c
,并且只会创建关系(c) -[:TO]-> (b)
。我想在这种情况下创建一个新的:Comp
节点。
是否刚刚创建了:Comp
节点,我随后希望create unique
建立一个关系。
我想出了两个我不太喜欢的解决方案:
我认为我可以通过可选关系来实现,例如
match (a) <-[r1?:FROM]- (c:Comp) -[r2?:TO]-> (b)
where r1 is null or r2 is null
create (a) <-[:FROM]- (d:Comp) -[:TO]-> (b)
但是如果:Comp
节点已经存在,我不确定如何创建额外的关系。
另一种选择是让c
上的属性唯一标识a
和b
,与
(a) <-[:FROM]- (c:Comp { from: a.uuid, to: b.uuid }) -[:TO]-> (b)
因此create unique
不会以部分匹配开头。但是存在多余的数据是一种气味。
答案 0 :(得分:1)
我在控制台中创建了我认为的模型:http://console.neo4j.org/?id=l6q3q0
也许试试这个:
START a=node:node_auto_index(name='a'), b=node:node_auto_index(name='b')
WHERE NOT (a<-[:FROM]-(:Comp)-[:TO]->b)
CREATE a<-[:FROM]-(c:Comp), c-[:TO]->b
答案 1 :(得分:0)
我还没有尝试过,但看起来MERGE
可以从2.0.0-rc1开始执行此操作。 http://docs.neo4j.org/chunked/milestone/query-merge.html
我想要像
这样的东西MERGE (a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
CREATE UNIQUE (c) -[:SUGGESTED_BY]-> (x:Algo)