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

Neo4j和cypher:如何匹配/创建路径的特定部分?,neo4j,cypher,Neo4j,Cypher,我有预先存在的节点a和b,想要创建一个路径 (a) <-[:FROM]- (c:Comp) -[:TO]-> (b) 然后,d将被重用为c,并且只会创建关系(c)-[:TO]>(b)。在这种情况下,我想创建一个新的:Comp节点 无论是否刚刚创建了:Comp节点,我随后希望从它创建唯一的关系 我提出了两种可能的解决方案,但我并不特别喜欢: 我想我可以选择一些关系,比如 match (a) <-[r1?:FROM]- (c:Comp) -[r2?:TO]-> (b) wh

我有预先存在的节点
a
b
,想要创建一个路径

(a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
然后,
d
将被重用为
c
,并且只会创建关系
(c)-[:TO]>(b)
。在这种情况下,我想创建一个新的
:Comp
节点

无论是否刚刚创建了
:Comp
节点,我随后希望
从它创建唯一的关系

我提出了两种可能的解决方案,但我并不特别喜欢:

我想我可以选择一些关系,比如

match (a) <-[r1?:FROM]- (c:Comp) -[r2?:TO]-> (b)
where r1 is null or r2 is null
create (a) <-[:FROM]- (d:Comp) -[:TO]-> (b)
MERGE (a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
CREATE UNIQUE (c) -[:SUGGESTED_BY]-> (x:Algo)

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

我在控制台中创建了我认为是您的模型:

也许可以试试这个:

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
START a=node:node\u auto\u index(name='a'),b=node:node\u auto\u index(name='b'))
如果不是(ab)
创建ab

我还没有尝试过,但从2.0.0-rc1开始,
MERGE
似乎可以做到这一点

我想要像这样的东西

match (a) <-[r1?:FROM]- (c:Comp) -[r2?:TO]-> (b)
where r1 is null or r2 is null
create (a) <-[:FROM]- (d:Comp) -[:TO]-> (b)
MERGE (a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
CREATE UNIQUE (c) -[:SUGGESTED_BY]-> (x:Algo)
合并(a)(b)
创建唯一的(c)-[:建议的用户]->(x:Algo)

这是一个精确的模型,您的建议比我对可选关系的建议要好,所以谢谢。但我可能不是很清楚:在创建或找到c之后,我需要一个新的关系,
创建唯一的c-[:suggered\u BY]->(x:Algo)
。在这里,如果我刚刚创建了c,我可以通过在代码中添加这一行来做到这一点,但我不确定如果c已经存在,我会怎么做。你是使用Neo 1.9还是2.0?如果使用2.0,则可以在表达式中使用CASE。否则,使用两个不同的查询可能更容易。第一个将确保它存在,第二个将创建下一个关系。我使用的是2.0,但看起来CASE只能在WHEN部分中有表达式,不能与create一起使用。(例如,
创建CASE 3 WHEN 2 THEN(x:Two)ELSE(x:Three)END
显然认为该CASE就是正在创建的,并在前3个CASE上抛出语法错误。)我可能不得不使用两个查询。谢谢你的帮助!