[英]Neo4j and cypher: how to match/create specific parts of a path?
我有预先存在的节点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
上具有沿b
的行唯一标识a
和b
属性。
(a) <-[:FROM]- (c:Comp { from: a.uuid, to: b.uuid }) -[:TO]-> (b)
因此, create unique
不会从部分匹配开始。 但是散布着冗余数据是一种气味。
我在控制台中创建了我认为是您的模型的模型: 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
我还没有尝试过,但是从2.0.0-rc1开始,似乎MERGE
可以做到。 http://docs.neo4j.org/chunked/milestone/query-merge.html
我想要类似的东西
MERGE (a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
CREATE UNIQUE (c) -[:SUGGESTED_BY]-> (x:Algo)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.