Neo4j和cypher:如何匹配/创建路径的特定部分?

时间:2013-11-06 17:09:11

标签: neo4j cypher

我有预先存在的节点ab,并且想要创建路径

(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上的属性唯一标识ab,与

一致
(a) <-[:FROM]- (c:Comp { from: a.uuid, to: b.uuid }) -[:TO]-> (b)

因此create unique不会以部分匹配开头。但是存在多余的数据是一种气味。

2 个答案:

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