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上抛出语法错误。)我可能不得不使用两个查询。谢谢你的帮助!